实体框架DbSet <tentity> .where(e => true)性能

时间:2019-03-05 07:38:55

标签: c# database performance entity-framework entity-framework-6

我正在使用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控制器的操作方法。类似于以下内容。

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(在这种情况下将返回整个参数集),此方法是否会导致性能下降?

1 个答案:

答案 0 :(得分:3)

我不了解性能,但是您可以在执行之前通过构建查询来解决所有问题。我认为这可以提高代码的可读性并减少混乱。

Mockito.verify(this.jdbcTemplate).query(any(), any(), captor.capture());

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

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();
    }
}