我正在使用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
和非null
组合创建不同的谓词。我知道我可以读取整个集合,然后一个接一个地筛选,但这将在大数据集时使用大量内存。 因此,只是为了澄清我的问题: 这是正确的方法吗?如果所有3个参数都是
null
(在这种情况下,将返回整个集合),这种方法会导致任何性能问题吗?
fkey
是空的,为什么还要使用它呢?只需不将其添加到表达式中即可。至于性能,这取决于SQL查询和生成的执行计划。前两个查询可能会创建相同的SQL或等效的执行计划。第三个查询则不会,它将创建一个通用查询,通常会导致糟糕的执行计划。 - Panagiotis KanavosDbSet<T>
。你自己的类提供了什么,而DbSet
没有提供的呢?如果你的类只是一个薄薄的包装器,那么为什么要使用它呢?实体没有外键,它们有关系和导航属性。如果你的“存储库”不理解这一点,如果它不能利用关系,因为它是“通用的”,那么它会毫无实际好处地造成伤害。它将抽象级别降低到EF或任何其他ORM所提供的级别以下。 - Panagiotis Kanavos