【问题标题】:Perform left join with Include() with Linq in C#在 C# 中使用带有 Linq 的 Include() 执行左连接
【发布时间】:2020-10-27 16:49:27
【问题描述】:

我在 C# 中遇到了 Entity Framework Core 的问题。我创建了一个函数来从我的数据库中返回Organisation 的列表。对于每个组织,我有两个表:

  • OrganisationUser:与Organisation 的链接是OrganisationId。此表使用 LicenceId 链接到 Licence
  • InvitationOrganisation 的链接是OrganisationId。此表使用 LicenceId 链接到 Licence

如果我按预期运行收到的查询,则会显示包含所有详细信息的组织列表。

public IQueryable<Organisation> GetOrganisationsByBillingDay(int billingDay)
{
    return _context.Organisation
                   .Include(org => org.OrganisationUser)
                        .ThenInclude(usr => usr.License)
                   .Include(org => org.Invitation)
                        .ThenInclude(i => i.License)
                   .Where(o => o.BillingDay == billingDay);
}

在此列表中,不包括在 OrganisationUserInvitation 中没有任何记录的组织。

如何包含它们?有没有比使用Linq 编写查询不同的方法?

更新

如果您查看 Linq 通过左连接创建的查询。

配置是

builder.Services.AddDbContext<BillingContext>(options =>
    options.UseSqlServer(configuration.GetConnectionString("BillingDatabase"),
    providerOptions => providerOptions.EnableRetryOnFailure()
));

上次更新

正如您在屏幕截图中看到的,Linq 执行 左连接 查询。我现在有我正在寻找的东西。问题出在数据而不是代码中。

【问题讨论】:

  • 上下文是如何配置的? Include 不执行连接,它告诉 EF Core 使用预先加载来加载相关实体。如果没有它,您仍然可以在上下文仍然存在时加载这些项目,只需访问相关属性即可。控制创建什么查询的是 DbContext 配置
  • @PanagiotisKanavos Include() 可以生成连接,这确实是我在我们的 EF 核心模型中看到的大部分内容,但我猜这是一个实现细节。
  • 关系定义为可选的还是必需的?一对一还是一对多?
  • @TanveerBadar 这并不意味着它用于加入,或者如果有人想加入就应该使用它。有 很多 个 SO 问题询问 why didn't Include() generate a JOIN ?。在大多数情况下,DbContet 中没有配置关系
  • 您发布的查询使用 LEFT JOIN,因此它不返回数据的唯一方法是如果没有匹配的数据。您是否尝试过在 SSMS 中运行该查询?各个查询是否返回了您的预期?没有重现人们不得不猜测的问题的样本数据

标签: c# linq .net-core entity-framework-core


【解决方案1】:

如果它是可选的,那么您的导航属性将是 null 或空集合,具体取决于关系的基数。您不需要做任何特别的事情,因为 Include() 隐含了连接,但用户在查询本身中没有明确指定。

最可能的问题是您的关系定义。你能分享你的模型配置吗?

【讨论】:

  • 对不起,什么部分? DbContext 设置? Organisation 模特?
  • 这将是您放入 OnModelCreating() 方法中的内容,或者如果按照惯例,则共享实体定义。就像人们在 cmets 中对您的问题所说的那样,只有当表本身没有任何内容时,LEFT JOIN 才会返回 0 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多