对于我的项目,我使用Entity Framework 5
和Code First
我通过存储库和UnitOfWork使用。
当我编辑/更新实体时,我想确保该实体存在于数据库中。我不确定这一定是怎么做的。首先,我想到查询具有此ID
的实体,并检查结果是否为null(未找到具有此ID的实体)并将此逻辑基于此。
然后我决定这可能不是最好的方式,所以现在我用它:
if (unitOfWork.EntityRepository.GetAll().Any(r => r.EntityID == model.EntityID))
GetAll
在Repository
中实施的位置为:
public virtual IQueryable<TEntity> GetAll()
{
return dbSet;
}
我不确定使用Any()
和尝试使用给定ID
获取记录之间是否存在任何重大差异,我需要以两种方式查询数据库(我认为)。但是因为我必须在我的代码中做一些常见的事情,所以我想知道如何做到这一点。
答案 0 :(得分:2)
它应该是平等的。
EF提供程序的Any()
和FirstOrDefault()
LINQ表达式之间的区别在于前者导致SQL EXISTS(...)
子句,后者导致简单WHERE ...
。只要您查询索引列,这两者都非常快(并且可以互换)。
答案 1 :(得分:1)
至于我,我不想使用Any()
来返回bool
结果,因为它生成(EF 5)非常丑陋的sql:
new Entities().Tasks
.Any()
变成
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Task] AS [Extent1]
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[Task] AS [Extent2]
)) THEN cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
所以在你的情况下,我最好尝试用给定的id获取记录并分析结果