簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM