如何使用EF5和存储库检查是否已存在具有给定ID的记录

时间:2013-12-11 08:36:27

标签: c# linq entity-framework-5

对于我的项目,我使用Entity Framework 5Code First我通过存储库和UnitOfWork使用。

当我编辑/更新实体时,我想确保该实体存在于数据库中。我不确定这一定是怎么做的。首先,我想到查询具有此ID的实体,并检查结果是否为null(未找到具有此ID的实体)并将此逻辑基于此。

然后我决定这可能不是最好的方式,所以现在我用它:

if (unitOfWork.EntityRepository.GetAll().Any(r => r.EntityID == model.EntityID))

GetAllRepository中实施的位置为:

    public virtual IQueryable<TEntity> GetAll()
    {
        return dbSet;
    }

我不确定使用Any()和尝试使用给定ID获取记录之间是否存在任何重大差异,我需要以两种方式查询数据库(我认为)。但是因为我必须在我的代码中做一些常见的事情,所以我想知道如何做到这一点。

2 个答案:

答案 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获取记录并分析结果