使用Linq to SQL确定行是否存在的最快方法是什么?

Pro*_*ist 47 c# lambda linq-to-sql

我对行的内容不感兴趣,我只想知道是否存在行.该Name列是主键,因此将有0或1个匹配的行.目前,我正在使用:

if ((from u in dc.Users where u.Name == name select u).Count() > 0)
    // row exists
else
    // row doesn't exist
Run Code Online (Sandbox Code Playgroud)

虽然上述工作,但通过选择行的所有内容(如果存在),它会做很多不必要的工作.以下是否创建更快的查询:

if (dc.Users.Where(u => u.Name == name).Any())
Run Code Online (Sandbox Code Playgroud)

...或者是否有更快的查询?

Mar*_*ell 91

这种Count()方法可以做额外的工作,如(在TSQL中)EXISTSTOP 1通常更快; db可以优化"至少有一行".就个人而言,我会使用any/predicate重载:

if (dc.Users.Any(u => u.Name == name)) {...}
Run Code Online (Sandbox Code Playgroud)

当然,你可以通过观察TSQL来比较每个人做的事情:

dc.Log = Console.Out;
Run Code Online (Sandbox Code Playgroud)

  • @David - 的确如此.我一直要求MS数据团队将其添加到EF ;-p (7认同)
  • 特别是因为我从未意识到Linq to Sql的SQL日志记录功能.我一直在运行SQL Profiler. (3认同)

小智 11

当然

if (dc.Users.Where(u => u.Name == name).Any())
Run Code Online (Sandbox Code Playgroud)

这是最好的,如果要检查多个条件,那么写起来非常简单

假设您要检查公司的用户

if (dc.Users.Where(u => u.ID== Id && u.Company==company).Any())
Run Code Online (Sandbox Code Playgroud)


MRF*_*ius 5

我认为:

if (dc.Users.Any(u => u.Name == name)) {...}
Run Code Online (Sandbox Code Playgroud)

是最好的方法。