c# - 左加入 Linq 查询

标签 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();

查询仅提供表 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();

回复您的评论,以上内容适用于 Linq to Objects 但不适用于 Linq to SQL。 Linq to SQL 会提示它“无法将表达式...转换为 SQL 并且无法将其视为本地表达式。”那是因为 Linq 无法将自定义 new SubObject 构造函数转换为 SQL。为此,您必须编写更多代码来支持转换为 SQL。参见 Custom Method in LINQ to SQL querythis article .

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

关于c# - 左加入 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182226/

相关文章:

c# - 无法使用 Imagemagick 在 C# 中将 PDF 转换为任何图像格式

c# - NHibernate IQueryable.SingleOrDefault 在子查询中。使用函数谓词而不执行

c# - 已尝试附加或添加不是新实体,可能是从另一个 DataContext 加载的

Linq 列表中的部分匹配?

c# - EF 查询特定表查询 db,ModelStoreConatiner 名称为 Schema

entity-framework - Entity Framework 核心 : Include many-to-many related objects in WebAPI

entity-framework - 为什么我会得到一个带有 Entity Framework 代码优先外键属性的额外外键列?

C#:在控制台应用程序中读取参数的适当 C# 方式是什么?

c# - 从多个后台线程同步 wpf dispatcher.invoke

c# - 从 C# 编码 "as string"参数