0

为了知识起见,我想将 SQL 查询转换为 LINQ 查询表达式。这是原始的SQL:

SELECT CT.COURSE_NODE_ID AS CNID, CT.NODE_TEXT
FROM    COURSE_RELATED_VERSIONS AS CRV INNER JOIN
        COURSE_TREE AS CT ON CRV.COURSE_NODE_ID = CT.COURSE_NODE_ID
WHERE (CRV.COURSE_ID = '38890') AND (CRV.COURSE_PARENT_NODE_ID = '-1')

基本上,只需根据特定条件(键匹配、课程 ID 匹配条件、父节点不等于 -1)从表中获取两个字段。这是我使用 LINQPad 提出的 LINQ 查询表达式:

from ct in COURSE_TREEs
join crv in COURSE_RELATED_VERSIONS 
     on ct.COURSE_NODE_ID equals crv.COURSE_NODE_ID
where crv.COURSE_ID == 38890 && crv.COURSE_PARENT_NODE_ID == -1
select new {ct.COURSE_NODE_ID, ct.NODE_TEXT}

还不错,我以 SQL 为中心的大脑仍然可以理解。但是,出于笑容,我想知道这个查询表达式作为 lambda 表达式会是什么样子。对于我的一生,我无法弄清楚语法。因此,我使用 LINQPad 中的 lambda 工具来查看我的 LINQ 查询表达式的样子。这里是:

COURSE_TREEs
.Join (
   COURSE_RELATED_VERSIONS, 
   ct => ct.COURSE_NODE_ID, 
   crv => crv.COURSE_NODE_ID, 
   (ct, crv) => 
      new  
      {
         ct = ct, 
         crv = crv
      }
)
.Where (temp0 => ((temp0.crv.COURSE_ID == 38890) && (temp0.crv.COURSE_PARENT_NODE_ID ==  -1)))
.Select (
   temp0 => 
      new  
      {
         COURSE_NODE_ID = temp0.ct.COURSE_NODE_ID, 
         NODE_TEXT = temp0.ct.NODE_TEXT
      }
)

哇!不是我认为 lambda 表达式查询的样子。所以,我正在研究 LINQPad 的输出,了解我的查询表达式如何看起来像一个 lambda 表达式,我想知道它是否可以写得更好?我仍在学习 LINQ(和 lambda 表达式)的技巧,但我不禁觉得这里生成的 lambda 表达式太复杂了!我错了吗?是否可以编写一个 lambda 表达式,它产生与原始 SQL 和查询表达式相同的输出,但又不是不必要的复杂?也许“复杂”是主观的,因为它可能只会在我的 SQL 大脑中显得复杂。我只是觉得 LINQPad 中生成的 lambda 表达式可以写得更好......我只是不知道如何。

4

1 回答 1

1

编译器将原始查询中的查询理解语法翻译成非常类似于 LinqPad 吐出的内容。这些是实际调用的方法。

如果您使用的是 a Join,这将非常简单。如果您查看 、 和 的方法签名,Join您应该能够弄清楚每个部分在做什么以及为什么这样做。当您分解它时,您应该会发现它实际上并不比您的原始查询复杂,它只是重写为使用方法调用。WhereSelect

于 2013-09-20T17:31:06.340 回答