gpt4 book ai didi

c# - 使用 C# EF Core 返回具有空子级的父级。包括

转载 作者:行者123 更新时间:2023-12-04 00:32:52 26 4
gpt4 key购买 nike

我们的目标是查询数据库,使用 Entity Framework Core 和 .Include(...) 扩展方法返回具有子级的对象集合,其中一些子级将为空。

我们有一个带有 C# 模型项目的表 Projects 和一个带有 C# 模型位置的表 Locations。

每个项目都有一个或零个 Location 对象,对象如下所示:

public class Project
{
public string LocationId { get; set; }
public Location Location { get; set; }
}

public class Location
{
public string LocationId { get; set; }
}

数据库设置如下所示:
        modelBuilder.Entity<Location>(entity =>
{
entity.HasKey(location => location.LocationId);
entity.ToTable("Locations");
});
modelBuilder.Entity<Project>(entity =>
{
entity.HasOne(project => project.Location).WithMany()
.HasForeignKey(x => x.LocationId);
entity.ToTable("Projects");

});

我们创建的查询是:
var projects = dbContext.Projects.Include(x => x.Location);

当我们期望 LEFT OUTER JOIN 时,EF 生成的 SQL 包括一个 LEFT JOIN:
SELECT [project].[LocationId] 
FROM [Projects] AS [project]
LEFT JOIN [Locations] AS [c] ON [project].[LocationId] = [c].[LocationId]

结果是只返回带有位置的项目。我们想要所有项目及其位置。

this link 我了解到 .Include(...) 决定执行 LEFT JOIN 或 LEFT OUTER JOIN 取决于外键的可空性:

Code First infers the multiplicity of the relationship based on the nullability of the foreign key. If the property is nullable then the relationship is registered as optional.



因为这不是发生的事情,所以缺少一些东西。

需要进行哪些修改才能返回所有项目,无论它们的位置是否会被填充?

谢谢!

最佳答案

您可以在 DefaultIfEmpty() 之后使用 Include() 方法。
例如:

var projects = dbContext.Projects.Include(x => x.Location).DefaultIfEmpty()...;

关于c# - 使用 C# EF Core 返回具有空子级的父级。包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com