LINQ LEFT JOIN加入另一个LEFT JOIN

时间:2015-05-05 05:18:02

标签: sql vb.net linq left-join

我对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的所有工作都很好。谁能解释一下发生了什么?

1 个答案:

答案 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});