LINQ查询中where子句下的条件顺序是否重要

时间:2014-08-20 06:55:19

标签: c# linq

我是LINQ的新手。任何人都可以澄清一下LINQ查询中where子句的条件顺序是否重要。

例如:以下两个查询之间的性能是否存在差异

查询-1

from prod in Products 
where prod.ExpiryDate == Products.Where(s => s.ID.Equals(CurrObj.Id) && 
      s.Type.Equals(CurrObj.Type)).Max(s => s.ExpiryDate) && 
      prod.ID.Equals(CurrObj.Id) && prod.Type.Equals(CurrObj.Type) 
select new
{
   AmountFrom = prod.AmountFrom,
   AmountTo = prod.AmountTo
}

查询-2

from prod in Products 
where prod.ID.Equals(CurrObj.Id) && 
      prod.Type.Equals(CurrObj.Type) &&
      prod.ExpiryDate == Products.Where(s => s.ID.Equals(CurrObj.Id) && s.Type.Equals(CurrObj.Type)).Max(s => s.ExpiryDate)
select new
{
    AmountFrom = prod.AmountFrom,
    AmountTo = prod.AmountTo
}

修改:我刚测量了性能。 Query-1需要大约900ms,而Query-2需要350ms。

2 个答案:

答案 0 :(得分:5)

如果它的LINQ-To-Objects很重要。

Enumerable.Whereif条款相当。所以这......

if(expensiveMethodThatReturnsBool() && num1 < num2)
{
    // ...
}

......可能效率低于:

if(num1 < num2 && expensiveMethodThatReturnsBool())
{
    // ...
}

因为&&是一个短路运营商。仅当第一个表达式返回true时,才会计算第二个表达式。这同样适用于||,仅当第一个返回false时才评估第二个。

7.11 Conditional logical operators


与链式Where类似。类似,因为谓词应用于通过前一个Where的每个剩余项目。

所以这......

.Where(x => expensiveMethodThatReturnsBool(x))
.Where(x => x.num1 < x.num2)

也可能效率低于:

.Where(x => x.num1 < x.num2)
.Where(x => expensiveMethodThatReturnsBool(x))

第一个在逻辑上等同于:

.Where(x => expensiveMethodThatReturnsBool(x) && x.num1 < x.num2)

答案 1 :(得分:1)

好吧,考虑是的,因为所有thos在最后生成的两个不同的sql语句都会有所不同,现在在某些情况下sql事情的顺序,但除非你测量它,否则你无法确定。

我建议你不要担心,直到你在衡量表现时面对或知道某些事情。