[英]LINQ query performance when applying Where clause
我對實體框架有疑問。
如果有人可以解釋一下鏈調用如何在LINQ和Entity Framework之間工作(以及在DB端執行查詢的那一點),我將不勝感激。
我想知道在以下兩種版本的方法中編寫LINQ查詢的性能差異(如果有):
方法1:
public IEnumerable<T> GetList(Expression<Func<T, bool>> expression, params Expression<Func<T, object>>[] includeProperties)
{
var results = dbSet.Where(expression).AsQueryable().AsNoTracking();
return includeProperties.Aggregate(results, (current, include) => current.Include(include));
}
像這樣的函數調用:
GetList(x => x.ID == id);
方法2:
public IEnumerable<T> GetList(params Expression<Func<T, object>>[] includeProperties)
{
var results = dbSet.AsQueryable().AsNoTracking();
return includeProperties.Aggregate(results, (current, include) => current.Include(include));
}
像這樣的函數調用:
GetList().Where(x => x.ID == id);
區別在於您的例程將返回IEnumerable<T>
而不是IQueryable<T>
。 在第二種情況下,Where將使用IEnumerable的版本而不是IQueryable的版本。 “鏈接”式停止於此(服務器端鏈停止,而客戶端鏈開始)。 此后不再進行任何更改將對生成的SQL無效。 一旦嘗試枚舉結果,它將導致所有記錄從數據源返回,然后在客戶端進行過濾,第一個將在數據源側進行過濾,因為您在仍為IQueryable的情況下進行了Where操作。
更改例程以返回IQueryable<T>
,然后在執行和性能方面應該相同。
**旁注,在方法1中,.AsQueryable()是多余的。 它已經是一個IQueryable。
這就是我期望這樣的函數編寫的方式:
public IQueryable<T> GetList(params Expression<Func<T, object>>[] includeProperties)
{
var results = dbSet.AsNoTracking().AsQueryable();
return includeProperties.Aggregate(results, (current, include) => current.Include(include));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.