为了便于学习,我想将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表达式可以写得更好......我只是不知道如何。
答案 0 :(得分:1)
编译器将原始查询中的查询理解语法转换为非常类似于LinqPad吐出的内容。这些是被称为的实际方法。
如果你使用的是Join
,这就像它得到的一样简单。如果您查看Join
,Where
和Select
的方法签名,您应该能够弄清楚每个部分正在做什么以及为什么这样做。当你分解它时,你应该看到它实际上并不比你的原始查询复杂,它只是被重写为使用方法调用。