我试图在 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 中,并在每个 MyObject 的 manySubObjects 中列出 0-n 对应记录的列表。
更新: 我尝试了下面提到的“可能重复”问题的答案。我现在有以下代码,它确实为 Table1 中的每个项目提供一条记录,即使没有 Table2 记录也是如此。
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”的属性的所有值为 null。如果 table2 中没有值,我真正想要的是“manySubObjects”为空。
最佳答案
为回复您的更新,要创建空列表,您可以在分配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();
- 这是一个 dotnetfiddle,它会尝试执行您正在尝试的操作。 https://dotnetfiddle.net/kGJVjE
- 这是基于您的评论的后续 dotnetfiddle。 https://dotnetfiddle.net/h2xd9O
回复您的评论,以上内容适用于 Linq to Objects 但不适用于 Linq to SQL。 Linq to SQL 会提示它“无法将表达式...转换为 SQL 并且无法将其视为本地表达式。”那是因为 Linq 无法将自定义 new SubObject
构造函数转换为 SQL。为此,您必须编写更多代码来支持转换为 SQL。参见 Custom Method in LINQ to SQL query和 this article .
我认为我们已经充分回答了您最初关于左联接的问题。考虑提出一个关于在 Linq to SQL 查询中使用自定义方法/构造函数的新问题。
关于c# - 左加入 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182226/