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

时间:2015-08-25 15:33:30

标签: c# .net linq entity-framework

我对实体框架有疑问。

如果有人能够详细解释链调用如何在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);

1 个答案:

答案 0 :(得分:1)

不同之处在于您的例程正在返回IEnumerable<T>而不是IQueryable<T>。在你的第二种情况下,Where将使用IEnumerable的版本而不是IQueryable的版本。那里的“链接”类型停止(服务器端链停止,客户端链开始)。在该点之后不再有任何更改将对生成的SQL产生任何影响。一旦你尝试枚举结果,它将导致所有记录从数据源返回,然后在客户端进行过滤,第一个将在数据源端进行过滤,因为你做了Where而它仍然是IQueryable。 / p>

更改您的例程以返回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));
}