[英]Return parents with null children using C# EF Core .Include
我們的目標是查詢數據庫,使用 Entity Framework Core 和.Include(...)
擴展方法返回具有子級的對象集合,其中一些子級將為空。
我們有一個C#樣板工程,並用C#模型位置的表位置的表項目。
每個項目都有一個或零個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]
結果是只返回帶有位置的項目。 我們想要所有項目及其位置。
從這個鏈接我了解到.Include(...)
決定執行 LEFT JOIN 或 LEFT OUTER JOIN 取決於外鍵的可空性:
Code First 根據外鍵的可空性推斷關系的多樣性。 如果該屬性可為空,則該關系將注冊為可選。
因為這不是發生的事情,所以缺少一些東西。
無論是否填充它們的位置,都需要進行哪些修改才能返回所有項目?
謝謝!
您可以在Include()
之后使用DefaultIfEmpty()
方法。
例如:
var projects = dbContext.Projects.Include(x => x.Location).DefaultIfEmpty()...;
我遇到了這種情況,除了生成的 SQL 是:
INNER JOIN [Blah.[Table] AS [x.Child] ON [x].[ChildId] = [x.Child].[Id]
這確實會導致問題,而問題的LEFT JOIN
會很好(正如其他人指出的那樣)。
那么為什么會發生這種情況呢? 我的ChildId
是一個Guid
,我已經確保將其設為Guid?
因為可空性使其成為可選的。
接下來我嘗試添加.IsRequired(false)
為映射ChildId
。 這給出了一個錯誤,告訴我實際問題是什么:我還在主鍵中包含了ChildId
(不必要的)。
從主鍵中刪除它會導致查詢更改為LEFT JOIN
,一切都很好。
在 T-SQL 中,左聯接和左外聯接是一回事。 Outer 關鍵字是可選的。 您提供的查詢將返回所有產品,無論它們是否有位置。 測試一下看看。
有關更多詳細信息,請參閱: SQL Server 中的 LEFT JOIN 與 LEFT OUTER JOIN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.