这个LINQ lambda表达式可以写得更好吗?

时间:2013-09-20 16:58:00

标签: c# sql linq linqpad

为了便于学习,我想将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)。 这是我提出的LINQ查询表达式,使用LINQPad:

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表达式可以写得更好......我只是不知道如何。

1 个答案:

答案 0 :(得分:1)

编译器将原始查询中的查询理解语法转换为非常类似于LinqPad吐出的内容。这些是被称为的实际方法。

如果你使用的是Join,这就像它得到的一样简单。如果您查看JoinWhereSelect的方法签名,您应该能够弄清楚每个部分正在做什么以及为什么这样做。当你分解它时,你应该看到它实际上并不比你的原始查询复杂,它只是被重写为使用方法调用。