[英]Linq request make a lot of queries to DB
我有這樣的ef類:
class Product
{
public int ProductId {set; get;}
...
public List<ProductBannedIn> BannedIn;
}
public class ProductBannedIn
{
public int ProductId {set; get;}
public Product Product {set; get;}
public int CountryId {set; get;}
public Country Country {set; get;}
}
並希望發出這樣的請求:
... //query - added some filters before
var products = query.Include(x => x.BannedIn)
.Join(context.ProductTranslation
.Where(x => x.LanguageId == language.LanguageId),
product => product.ProductId,
translation => translation.Product.ProductId,
(x,y) => new {
Id = x. ProductId,
Name = y.Name,
Description = y.Description,
Type = x.TypeId,
BannedIn = x.BannedIn.Select(b => b.CountryId),
}).ToList();
問題:問題是當我獲取例如1000種產品時,這部分
BannedIn = x.BannedIn.Select(b => b.CountryId)
對每一行進行查詢,其速度非常慢。 我在調試器中看到的是,對於每個產品,都進行查詢以獲取BannedIn,但是應該已經獲取了,因為我有Include
需要實現的目標:
通常應該像對數據庫的1條查詢,而不是對每一行(x.BannedIn)
在2.1 EF Core之前的版本中,這是一個帶有相關子查詢的已知問題(即N + 1查詢)。 它已在2.1中修復-請參見EF Core 2.1中的新功能 - 相關子查詢的優化 :
我們改進了查詢轉換,以避免在許多常見方案中執行“ N + 1”個SQL查詢,在這些常見方案中,在投影中使用導航屬性會導致將根查詢中的數據與相關子查詢中的數據連接在一起。 優化需要緩沖子查詢的結果,並且我們要求您修改查詢以采用新行為。
因此,如有可能,請升級到最新的EF Core位,然后通過將.ToList()
添加到相關子查詢中來“選擇加入”以進行優化,如文檔鏈接中所述:
BannedIn = x.BannedIn.Select(b => b.CountryId).ToList(),
結果將是執行2個SQL查詢(這是EF Core與關聯的集合一起工作的方式-每個集合1個SQL查詢),但當前不是每個產品1個。
我剛剛更新了ef軟件包,並且一切正常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.