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

萨利赫

我对实体框架有疑问。

如果有人可以解释一下链调用如何在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));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查询索引视图时WHERE子句的性能

基于 WHERE 子句的 SELECT 查询的性能

WHERE-CASE子句子查询性能

在 where 子句中调用扩展方法时的 C# LINQ 性能

向where子句添加参数时的性能

多表LINQ查询中的WHERE子句

在where子句中构建动态linq查询

扩展方法不应用LINQ where子句

“Where”中新对象的Linq查询性能

当WHERE子句具有特殊字符时,LINQ查询不返回结果

性能:多个条件WHERE子句还是动态查询?

不使用where子句重写查询以提高性能

如何提高where子句搜索串联值的SQL查询性能

Nhibernate在应用where子句之前将Collection属性全部加载到Linq上吗?不可查询?

复杂linq查询中的where子句给出以下错误“查询主体必须以select子句或group子句linq结尾”

LINQ查询中where子句下的条件顺序是否重要

使用导航属性和Where子句的Linq查询

LINQ查询中的where子句不根据数据求值

使用 where 子句对相关数据进行 Linq 查询

如何在LINQ查询中放入条件WHERE子句

在Include语句中使用Where子句的Linq查询

如何使用 Where 子句从 Linq 查询中跟踪 SQL 语句?

C# Linq 使用 where 子句压缩连接查询

带有复杂 where 子句的复杂 LINQ 查询

具有多个where子句的实体框架核心LINQ查询

如何使用多个条件where子句创建Linq查询

将“where”子句动态添加到 linq 查询

LINQ-“查询语法”上的动态Where子句

linq 查询的 where 子句中的“OR”条件返回 null