左连接Linq查询

kra*_*626 5 c# linq entity-framework join left-join

我正在尝试进行左连接,而不是linq查询中的内连接.我找到了与使用相关的答案DefaultIfEmpty()但是我似乎无法使其工作.以下是linq查询:

from a in dc.Table1 
join e in dc.Table2 on a.Table1_id equals e.Table2_id
where a.Table1_id == id
orderby a.sort descending
group e by new
{
    a.Field1,
    a.Field2
} into ga
select new MyObject
{
    field1= ga.Key.Field1,
    field2= ga.Key.Field2,
    manySubObjects = (from g in ga select new SubObject{
                                                        fielda= g.fielda,
                                                        fieldb= g.fieldb
                                                        }).ToList()
}).ToList();
Run Code Online (Sandbox Code Playgroud)

该查询仅向我提供表1中具有表2中相应记录的行.我希望表1中的每条记录都填充到MyObject中,并且每个MyObject的manySubObjects中列出的0-n对应记录列表.

更新:我尝试了下面提到的"可能重复"的问题的答案.我现在有以下代码,即使没有Table2记录,也会为Table1中的每个项目提供一条记录.

from a in dc.Table1 
join e in dc.Table2 on a.Table1_id equals e.Table2_id into j1
from j2 in j1.DefaultIfEmpty()
where a.Table1_id == id
orderby a.sort descending
group j2 by new
{
    a.Field1,
    a.Field2
} into ga
select new MyObject
{
    field1= ga.Key.Field1,
    field2= ga.Key.Field2,
    manySubObjects = (from g in ga select new SubObject{
                                                        fielda= g.fielda,
                                                        fieldb= g.fieldb
                                                        }).ToList()
}).ToList();
Run Code Online (Sandbox Code Playgroud)

但是,使用此代码,当table2中没有记录时,我将"manySubObject"作为一个列表,其中包含一个"SubObject",其中包含"SubObject"属性的所有空值.如果table2中没有值,我真正想要的是"manySubObjects"为null.

Sha*_*tin 3

为了回复您的更新,要创建空列表,您可以在 的分配中执行三元组manySubObjects

select new MyObject
{
    field1= ga.Key.Field1,
    field2= ga.Key.Field2,
    manySubObjects =
        (from g in ga select g).FirstOrDefaut() == null ? null : 
        (from g in ga select new SubObject {
           fielda= g.fielda,
           fieldb= g.fieldb
        }).ToList()
}).ToList();
Run Code Online (Sandbox Code Playgroud)

回复您的评论,上面的内容适用于 Linq to Objects,但不适用于 Linq to SQL。Linq to SQL 会抱怨“无法将表达式...转换为 SQL 并且无法将其视为本地表达式”。这是因为 Linq 无法将自定义new SubObject构造函数转换为 SQL。为此,您必须编写更多代码来支持 SQL 转换。看LINQ to SQL 查询中的自定义方法本文

我认为我们已经充分回答了您关于左连接的原始问题。考虑提出一个有关在 Linq to SQL 查询中使用自定义方法/构造函数的新问题。