gpt4 book ai didi

c# - Entity Framework DbSet.Where(e => true) 性能

转载 作者:搜寻专家 更新时间:2023-10-30 22:05:51 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 6 访问数据库。

下面两种方法在性能上有区别吗?

public IEnumerable<TEntity> GetAll()
{
using (var context = new DbContext())
return context.Set<TEntity>().ToList();
}

public IEnumerable<TEntity> GetAll()
{
using (var context = new DbContext())
return context.Set<TEntity>().Where(e => true).ToList();
}

我问是因为我想使用条件谓词。像下面这样的东西。

public IEnumerable<TEntity> GetAll(TKey fKey)
{
using (var context = new DbContext())
return context.Set<TEntity>()
.Where(e => fKey != null ? e.fKey == fKey : true).ToList();
}

其中 fKey 是外键。

更新:由于许多评论都集中在我的最后一个示例上,我同意这是一个糟糕的用例,我将解释我为什么要问。

所以我有如下所示的存储库方法。

public class EntityRepository
{
public IEnumerable<Entity> GetAll(Expression<Func<Entity, bool>> predicate)
{
using (var context = new DbContext())
return context.Set<Entity>.Where(predicate).ToList();
}
}

我正在使用此方法形成 Web API Controller 的操作方法。类似于以下内容。

public IHttpActionResult GetEntities(string param1, string param2, string param3)
{
Expression<Func<Entity, bool>> predicate = e =>
(param1 != null ? e.field1 == param1 : true)
&& (param2 != null ? e.field2 == param2 : true)
&& (param3 != null ? e.field3 == param3 : true);
var entities = EntityRepository.GetAll(predicate);
return Ok(entities);
}

所以在这里我从 URI 中获取了一些查询参数,并基于它们创建了谓词。其中一些参数可以是 null,在这种情况下我不想过滤这些参数。但我不想为参数的所有组合是否为 null 创建不同的谓词。

我知道我可以读取整个数据集,然后一个一个地过滤,但是对于大数据集,这会占用大量内存。

所以只是为了澄清我的问题:这是一种正确的方法吗?如果所有 3 个参数都为 null(在这种情况下将返回整个集合)此方法是否会导致性能下降?

最佳答案

我不知道性能如何,但是您可以通过在执行之前构建查询来一起解决这个问题。我认为这提高了代码的可读性并减少了混淆。

public IEnumerable<TEntity> GetAll(TKey fKey)
{
using (var context = new DbContext())
{
IQueryable<TEntity> query = context.Set<TEntity>();

if (fKey != null)
{
query = query.Where(e => e.fKey == fKey);
}

return query.ToList();
}
}

编辑:调用您的问题编辑,我认为以下方法具有相同的用法,但避免了 sql 查询中不必要的语句:

public IEnumerable<Entity> GetAll(
Func<IQueryable<Entity>, IQueryable<Entity>> query)
{
using (var context = new DbContext())
return query(context.Set<Entity>).ToList();
}

// then use like this:
EntityRepository.GetAll((entities) =>
{
var query = entities;
if (param1 != null) query = query.Where(e => e.field1 == param1);
if (param2 != null) query = query.Where(e => e.field2 == param2);
if (param3 != null) query = query.Where(e => e.field3 == param3);
return query;
});

关于c# - Entity Framework DbSet<TEntity>.Where(e => true) 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54997636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com