簡體   English   中英

應用Where子句時的LINQ查詢性能

[英]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.

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