Sql LINQ左连接到另一个左连接

Sql LINQ左连接到另一个左连接,sql,vb.net,linq,left-join,Sql,Vb.net,Linq,Left Join,我对LINQ非常熟悉,而且是个全新的左连接转换者。 我用SQL编写了一个查询,它工作得很好,我正在尝试将它放入LINQ中。我错过了一些东西,但看不见。SQL是: DECLARE @Version int = 1 SELECT Q.WebFormTemplateQuestionID, Lay.* FROM WebFormTemplates WFT INNER JOIN WebFormTemplateQuestions Q ON Q.WebFormTemplateID = WFT.WebFormTe

我对LINQ非常熟悉,而且是个全新的左连接转换者。 我用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
但对于非专业项目,我需要键入:

?q3.FirstOrDefault().Lay.FirstOrDefault().QuestionAlign
以获取值。 为什么我需要第一次或第二次调用默认值?我错过了什么?
当我进行选择时,我假设的Lay的值都为null,因为我在某处没有其他FirstOrDefault。从Hdr、WFT到Q,一切都很好。有人能解释发生了什么吗?

我已经用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});

您有一个二维阵列x,。FirstOrDefault获取数组的索引零,或不返回空项。每个维度需要两次,一次。谢谢。我试着将这行代码转换成我认为是VB等价的代码,将新版本中的Lay In ctx.WebFormTemplateLayoutHeaderID,Lay.WebFormTemplateQuestionID}与新版本中的{Hdr.WebFormTemplateLayoutHeaderID,Q.WebFormTemplateQuestionID}连接到Lay_Join中,但没有起作用。我在前面添加了单词组,消除了一些错误,但仍然没有成功。我还尝试了New的变体,但没有成功。您需要匹配New{K=1}等于New{K=1}中使用的属性类型,这里两个K属性都是Int类型。