使用Entity框架LINQ有效地检查数据库中是否存在记录

时间:2018-01-29 14:49:00

标签: c# entity-framework linq linq-to-sql

我需要使用实体框架检查数据库中是否已存在客户代码。理想情况下,我会写这样的简单的SQL查询:

select id from dbo.Customer where RecActive = 1 and Code = 'xxx';

如果查询结果为空,则表示客户按代码' xxx'还不存在。在实体框架中有多种方式来写这个,但我看最接近的那个。 注意:代码字段上有唯一索引

  using (var context = new CustomerContext())
  {
    // not very efficient as it reads all columns
    return context.Customers.Where(c => c.RecActive && c.Code == customerCode).SingleOrDefault() != null ? true : false;

    return context.Customers.Where(c => c.RecActive && c.Code == customerCode).Count() > 0 ? true : false;

    // translates to this query:
    // exec sp_executesql N'SELECT [Limit1].[Id] AS [Id]
    // FROM ( SELECT TOP (2) 
    //        [Extent1].[Id] AS [Id]
    //        FROM [dbo].[Customer] AS [Extent1]
    //        WHERE ([Extent1].[RecActive] = 1) AND (([Extent1].[Code] = 
    //          @p__linq__0) OR (([Extent1].[Code] IS NULL) AND 
    //          (@p__linq__0 IS NULL)))
    //        )  AS [Limit1]',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'xxx'
    int a = context.Customers.Where(c => c.RecActive && c.Code == customerCode).Select(c => c.Id).SingleOrDefault();             
    return a > 0 ? true : false;

    return context.Customers.Where(c => c.RecActive && c.Code == customerCode).Any();
  }

也许还有其他好处(性能替代品)?注意:我必须使用实体框架linq而不是原始查询(我真的很喜欢),因为linq在整个项目中始终如一地使用。

2 个答案:

答案 0 :(得分:2)

如果您只想检查存在,请使用.Any()。如果要检索与条件匹配的ID,请使用Select,例如:

 context.Customers
        .Where(c => c.RecActive && c.Code == customerCode)
        .Select(c => c.id);

如果多个ID是有效结果,则无论id的类型是什么,您的方法都应返回字符串/整数数组。您可以使用.ToArray();

返回一系列ID
 return context.Customers
               .Where(c => c.RecActive && c.Code == customerCode)
               .Select(c => c.id)
               .ToArray();

如果您期望多个ID,则必须决定如果获得倍数结果该怎么做:

    如果有多个结果,
  • FirstOrDefault()将返回第一个ID,而不会抛出。
  • 如果有多个结果阻止使用可能无效的ID,
  • SingleOrDefault()将抛出。

例如:

return context.Customers.Where(c => c.RecActive && c.Code == customerCode)
               .Select(c => c.id)
               .SingleOrDefault();

答案 1 :(得分:0)

由于您的代码会忽略实际ID,并且只返回true / false表示其存在,因此只需调用Any即可执行此操作:

return context.Customers.Any(c => c.RecActive && c.Code == customerCode);