2015-03-03 23 views
-4

我不知道哪一种方法更快,排序和LINQ从MS SQL数据库中选择元素布尔值进行排序:最快的方式通过LINQ

.OrderBy(c => c.StartDate) 
.ThenBy(c => !c.HasErrors) 
.FirstOrDefault(); 

.OrderBy(c => c.StartDate) 
.ThenByDescending(c => c.HasErrors) 
.FirstOrDefault(); 

也许每一个元素的nagation从表(HasErrors)对查询执行时间有影响吗?任何人都有关于此问题的信息?

+10

自己衡量一下。这比等待这里的回应花费更少的时间。 – 2015-03-03 12:52:10

+7

比较你自己的差异。我的猜测是:没关系。 – CodeCaster 2015-03-03 12:52:11

+0

那么'c.HasErrors'只是'c.HasErrors == true',可能'c.HasErrors == false'需要相同的时间... – libik 2015-03-03 12:53:10

回答

-1

起初:我没有任何数据证实这一点,但两种方法的区别几乎肯定不相关。数据库引擎很有可能在幕后做类似的事情。因此,只需使用第二个版本,因为它更具可读性(在第一种方法中可能会忽略!)。

尽管你的问题是:如果你只需要满足条件的第一个,为什么还要关心用布尔值排序呢?

什么:

.OrderBy(c => c.StartDate).FirstOrDefault(c => c.HasErrors); 

我知道,有一个小的区别,因为你会得到空,如果有没有错误没有元素。然后,您的解决方案将为第一个元素提供错误。但我想这是你真正想要的(如果我错了,就责备我)。

1

第二种方法在理论上更快,因为在将它与TRUE进行比较之前,您并不是首先翻转c.HasErrors上的位。

的逻辑步骤如下

FIRST:

1. Order By start date 
2. Set c.HasErrors = !c.HasErrors 
3. Then Order By c.HasErrors 
4. Then return the first record, or null 

第二:

1. Order By start date 
2. Then Order Descending By c.HasErrors 
3. Then return the first record, or null 

在第一种情况下,你有你的查询来执行额外的步骤。并且它必须为每条记录执行它,所以项目列表越长,它所需的时间就越多。