[英]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> categoryNames
的List<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)
解決方案都將在應用選擇之前從服務器加載所有數據。
是否有滿足以下條件的查詢:
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.