应用Where子句时的LINQ查询性能

本文关键字:LINQ 查询 性能 Where 子句 应用 | 更新日期: 2023-09-27 18:09:50

我有一个关于实体框架的问题

如果有人能解释一下LINQ和实体框架之间的链调用是如何工作的,我会很感激的(以及在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);

应用Where子句时的LINQ查询性能

区别在于您的例程返回的是IEnumerable<T>而不是IQueryable<T>。在第二种情况下,Where将使用IEnumerable的版本而不是IQueryable的版本。"链"到此为止(服务器端链停止,客户端链开始)。在此之后,任何更改都不会对生成的SQL产生任何影响。一旦您尝试枚举结果,它将导致所有记录从数据源返回,然后在客户端进行过滤,其中第一个记录将在数据源端进行过滤,因为您执行了where,而它仍然是一个IQueryable。

将你的例程改为返回一个IQueryable<T>,然后它们在执行和性能方面应该是相同的。

**旁注,在方法1中,. asqueryable()是多余的。它已经是一个可查询的

我希望这样的函数是这样写的:

public IQueryable<T> GetList(params Expression<Func<T, object>>[] includeProperties)
{
  var results = dbSet.AsNoTracking().AsQueryable();
  return includeProperties.Aggregate(results, (current, include) => current.Include(include));
}