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

本文关键字:更好 LINQ lambda 表达式 这个 | 更新日期: 2023-09-27 18:32:13

为了知识起见,我想将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 表达式可以写得更好......我只是不知道怎么做。

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

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

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