【发布时间】:2015-01-27 23:51:46
【问题描述】:
我正在尝试在 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();
该查询只为我提供表 1 中在表 2 中具有相应记录的行。我希望将表 1 中的每条记录填充到 MyObject 中,并在 manySubObjects 中为每个 MyObject 列出一个 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();
但是,使用此代码,当 table2 中没有记录时,我将“manySubObject”作为一个列表,其中有一个“SubObject”,其中“SubObject”的属性的所有值为空。如果 table2 中没有值,我真正想要的是“manySubObjects”为空。
【问题讨论】:
-
当 table2 中没有值时我应该添加 manySubObjects 应该为空。我在上面的问题中进行了尝试,结果包含所有记录,所以这是一个改进,但是当 table2 中没有记录时,我得到一个实例化的子对象,其中包含所有空值。如果 table2 中没有值,我真正想要的是“manySubObjects”为空。
-
我认为我的答案中的三元组解决了您最近关于需要“manySubObjects”为空的评论。
-
.Net Fiddle dotnetfiddle.net/bSRdNp
标签: c# linq entity-framework join left-join