使用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 

虽然上面的工作,它通过select行的所有内容(如果存在)做了很多不必要的工作。 以下是否创build了一个更快的查询:

 if (dc.Users.Where(u => u.Name == name).Any()) 

…还是有更快的查询?

Count()方法可能会做额外的工作,因为(在TSQL中) EXISTSTOP 1通常要快得多; 数据库可以优化“是否至less有一排”。 就个人而言,我会使用any / predicate超载:

 if (dc.Users.Any(u => u.Name == name)) {...} 

当然,你可以通过观看TSQL来比较每个人做什么:

 dc.Log = Console.Out; 

当然

 if (dc.Users.Where(u => u.Name == name).Any()) 

这是最好的,如果多个条件来检查,那么这是很简单的写作

假设你想检查公司的用户

 if (dc.Users.Where(u => u.ID== Id && u.Company==company).Any()) 

我认为:

 if (dc.Users.Any(u => u.Name == name)) {...} 

是最好的方法。

我不同意selecttop 1将总是胜过所有SQL实现的select count。 这是所有的执行依赖,你知道。 奇怪的是,即使存储在特定数据库中的数据的性质也影响整体结果。

让我们来看看如果我这么做的话,我将如何实现它们:对于这两种情况,投影(WHERE子句)评估都是一个常见的步骤。

接下来,selecttop 1,你将不得不阅读所有的字段(除非你selecttop 1'x',例如:select top 1 1)。 这将在function上等同于IQueryable.Any(…)。除了您将花费一些时间在第一次遇到的logging的每列的值闪烁,如果EXISTS。 如果在语句中findSELECT TOP,如果没有投影后处理(例如ORDER BY子句),则投影是截断的。 这个预处理的成本很低,但是如果没有logging的话,这是额外的成本,在这种情况下,一个完整的项目仍然完成。

对于select count,预处理没有完成。 投影完成,如果EXISTS是假的,结果是即时的。 如果EXISTS是真的,则计数仍然很快,因为它仅仅是dW_Highest_Inclusive – dW_Lowest_Exclusive。 如500 – 26.如果存在是错误的,结果是更加即时。

因此,剩下的情况是:投影的速度有多快?通过完整的投影,你放松了多less? 而答案导致这里最关键的问题是:[NAME]字段是否被索引! 如果您在[NAME]上有一个索引,那么这两个查询的性能就会如此接近,以至于可以归结为开发人员的偏好。

总的来说,我会简单地写两到四个linq查询,并输出前后的时间差。

  1. select计数
  2. selecttop 1
  3. selecttop 1 1
  4. select任何

在[NAME]上重复全部4个非聚集索引;