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