簡體   English   中英

如何使用單個SQL生成的查詢在EFCore中選擇模擬多對多屬性

[英]How to select properties of simulated many-to-many in EFCore with single SQL generated query

EFCore在不創建鏈接實體的情況下不支持多對多關系。 我需要從一對多關系的“另一端”有效地選擇屬性的子集。

我發誓這已經有了答案,但是還沒有找到答案。

使用這些模型:

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public Author Author { get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
} 

public class Category
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public string ExtraProperties {get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
}

public class BookCategory
{
    public int BookId { get; set; }
    public Book Book { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

這個問題是類似但不同的問題的擴展,題為“ 從實體框架核心中的包含屬性中選擇特定屬性

我正在尋找一個查詢,該查詢返回Book List<string> categoryNamesList<string> categoryNames

使用“投影”的此嵌套選擇將導致多個SQL查詢:

var result= await _ctx.Books
    .Where(x => x.BookId == id)
    .Select(x => x.BookCategorys
        .Select(y => y.Category.CategoryName )
        .ToList())                
    .FirstOrDefaultAsync();

任何具有.Include(x => x.BookCategory).ThenInclude(x => Category)解決方案都將在應用選擇之前從服務器加載所有數據。

是否有滿足以下條件的查詢:

  • 僅生成1條SQL查詢
  • 不會加載整個鏈接實體和/或整個導航屬性2個“跳”。
  • 僅返回CategoryNames的List<string>

我從這個Entity Framework Core推斷出, 對於一對多關系會生成兩個選擇查詢 ,這是不可能的。

通常,您無法控制生成的SQL以及ORM執行多少個SQL查詢。 並且已知在撰寫本文時(2.0.2版),當查詢包含集合投影時,EF Core會生成N + 1個查詢。 此問題在下一個2.1版本中已修復 ,但仍將生成並執行至少2個查詢。

但是每條規則都有例外。 既然你只想返回一個相關的電突出,你可以簡單地使用SelectMany代替原來的Select + FirstOrDefault構建。 這些等效於這種情況,並且EF Core不夠聰明,無法以與后者相同的方式對待后者。 算上需要考慮多少其他情況,這是可以理解的。 好處是,以這種方式重寫LINQ查詢會產生所需的單個SQL查詢轉換:

var result = await _ctx.Books
    .Where(x => x.BookId == id)
    .SelectMany(x => x.BookCategorys
        .Select(y => y.Category.CategoryName))
    .ToListAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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