繁体   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