我对LINQ非常环保,并且转换LEFT JOIN是全新的。 我在SQL中编写了一个查询(工作正常),我试图将其纳入LINQ。我错过了什么,但看不到它。 SQL是:
DECLARE @Version int = 1
SELECT Q.WebFormTemplateQuestionID, Lay.*
FROM WebFormTemplates WFT
INNER JOIN WebFormTemplateQuestions Q ON Q.WebFormTemplateID = WFT.WebFormTemplateID
LEFT JOIN WebFormTemplateLayoutHeaders Hdr ON Hdr.WebFormTemplateID = WFT.WebFormTemplateID and hdr.Version = @Version
LEFT JOIN WebFormTemplateLayouts Lay ON Lay.WebFormTemplateLayoutHeaderID = Hdr.WebFormTemplateLayoutHeaderID AND Lay.WebFormTemplateQuestionID = Q.WebFormTemplateQuestionID
WHERE WFT.WebFormTemplateID = 2
ORDER BY Q.SortOrder
我写的LINQ是:
Version = 1
Dim q3 = From WFT In ctx.WebFormTemplates
Join Q In ctx.WebFormTemplateQuestions On Q.WebFormTemplateID Equals WFT.WebFormTemplateID
Group Join Hdr In ctx.WebFormTemplateLayoutHeaders On Hdr.WebFormTemplateID Equals WFT.WebFormTemplateID Into Hdr_join = Group
From Hdr In Hdr_join.Where(Function(x) x.Version = Version).DefaultIfEmpty()
Group Join Lay In ctx.WebFormTemplateLayouts On Lay.WebFormTemplateLayoutHeaderID Equals Hdr.WebFormTemplateLayoutHeaderID And Lay.WebFormTemplateQuestionID Equals Q.WebFormTemplateQuestionID Into Lay_join = Group
From Lay In Lay_join.DefaultIfEmpty()
Where WFT.WebFormTemplateID = 2
有了这个,我可以打破代码并在即时窗口中获取我输入时的预期值:
?q3.FirstOrDefault().Hdr.Version
但是对于Lay项目,我需要输入:
?q3.FirstOrDefault().Lay.FirstOrDefault().QuestionAlign
获取价值。 为什么我需要第二次调用FirstOrDefault?我在这里错过了什么? 当我执行Select时,Lay I假设的值都为null,因为我没有其他的FirstOrDefault。来自Hdr,WFT和Q的所有工作都很好。谁能解释一下发生了什么?
答案 0 :(得分:0)
我已经从C#中的SQL编写了等效的Linq查询。 相应地更新VB。
Version = 1
Dim q3 = (from WFT In ctx.WebFormTemplates
join Q In ctx.WebFormTemplateQuestions on Q.WebFormTemplateID equals WFT.WebFormTemplateID
join Hdr In ctx.WebFormTemplateLayoutHeaders on Hdr.WebFormTemplateID equals WFT.WebFormTemplateID into Hdr_join
from Hdr In Hdr_join.Where(Function(x) x.Version = Version).DefaultIfEmpty()
join Lay In ctx.WebFormTemplateLayouts on new { Lay.WebFormTemplateLayoutHeaderID,Lay.WebFormTemplateQuestionID } equals new {Hdr.WebFormTemplateLayoutHeaderID, Q.WebFormTemplateQuestionID} into Lay_join
from Lay In Lay_join.DefaultIfEmpty()
where WFT.WebFormTemplateID = 2
select new {Q.WebFormTemplateQuestionID, Lay});