【发布时间】:2020-10-27 16:49:27
【问题描述】:
我在 C# 中遇到了 Entity Framework Core 的问题。我创建了一个函数来从我的数据库中返回Organisation 的列表。对于每个组织,我有两个表:
-
OrganisationUser:与Organisation的链接是OrganisationId。此表使用 LicenceId 链接到Licence表 -
Invitation与Organisation的链接是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);
}
在此列表中,不包括在 OrganisationUser 或 Invitation 中没有任何记录的组织。
如何包含它们?有没有比使用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