我想使用一種Select()方法,但似乎Select()并不真正接受 await 關鍵字。因此我問自己一個問題,我應該繼續使用 Eager Loading 異步還是實際上 Select 方法同步非常好并且會像其他方法一樣有效地完成作業?
我使用 將Select()一個非常大的物體映射到 DTO 和 Eager Loading 基本上Select()通過創建一堆方法來模擬該方法,包括一些關系,例如GetObjectWithPriceandGetObjectWithPriceAndDate等等,這就是為什么我要求使用Select()方法而不是同步性讓我擔心。
編輯
要回答@AvrohomYisroel,這是我迄今為止對我的代碼所做的事情:
public async Task<IReadOnlyList<Book>> GetAllBooksWithRelatedDataAsync()
{
var books = await context.Books
.AsNoTracking()
.AsSplitQuery()
.Include(d => d.Price)
.Include(d => d.Images)
.Include(d => d.Author)
.ToListAsync();
return books;
}
這就是我異步使用 Eager Loading 的方式。而且我一直在質疑在使用時Select()是否應該期望它在異步性方面以相同的方式使用。但是,我可能會完全感到困惑,因為它的使用是同步的,因為它的作業方式與我認為的不同。Select()
uj5u.com熱心網友回復:
.Select()如果在服務器上執行或投影通常是最有效的資料檢索形式,但是當我們使用投影時,我們排除了包含的使用。將更改物件圖的形狀,如果您不更改形狀,則只需使用,當您需要包含相關物體時,它會為您提供最佳性能,因為它將每個導航路徑作為單獨的查詢加載。.Select().Include().AsSplitQuery()
.Select()在存盤庫模式中經常使用將資料模型映射到 DTO,您可以使用其他庫來簡化內部呼叫.Select().- 從 Core 6 開始,LINQ to Entity Projections 也支持
.AsSplitQuery(),這意味著在Eager Loading和Projections之間進行選擇時,性能現在不再受關注。
投影的重點是不僅要拉回所需的相關導航物體,還要拉回我們需要的特定欄位。.Select()因此,是一種比 更急切的加載形式.Include(),但允許您選擇要加載的欄位。
但是我們不能同時擁有.Select() .Include .Include()' in a server expression, in fact any () expressed before the.Select() will be ignored unless the.IQueryable() has been loaded into an.IEnumerable()`。
至于異步性,.Select()或者.Include()如果將它們應用于IQueryable<T>運算式,則以下內容仍然是異步的:
var books = await context. Books
.Select(b => new BookDTO {
ISBN = b.BookNumber,
Title = b.Title,
Author = b.Author.Name,
Price = b.Price,
Images = b.Images.Select(i => i.Url)
})
.AsSplitQuery()
.ToListAsync();
唯一.Select() 可能將您限制在同步背景關系的情況是,如果您在投影中使用了無法轉換為資料存盤 (SQL) 運算式的函式或邏輯。在這種情況下,EF Core 將自動評估您的運算式以將資料帶入記憶體,然后它將執行.Select(). 那時您正在處理IEnumerable<T>和同步評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529373.html
標籤:C#林克异步实体框架核心
