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

Mah*_*esh 5 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
}
Run Code Online (Sandbox Code Playgroud)

查询-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
}
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚测量了性能.Query-1需要大约900ms,而Query-2需要350ms.

Tim*_*ter 5

如果它是LINQ-To-Objects则很重要.

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

if(expensiveMethodThatReturnsBool() && num1 < num2)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

...可能效率低于:

if(num1 < num2 && expensiveMethodThatReturnsBool())
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

7.11条件逻辑运算符


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

所以这...

.Where(x => expensiveMethodThatReturnsBool(x))
.Where(x => x.num1 < x.num2)
Run Code Online (Sandbox Code Playgroud)

也可能效率低于:

.Where(x => x.num1 < x.num2)
.Where(x => expensiveMethodThatReturnsBool(x))
Run Code Online (Sandbox Code Playgroud)

第一个在逻辑上等同于:

.Where(x => expensiveMethodThatReturnsBool(x) && x.num1 < x.num2)
Run Code Online (Sandbox Code Playgroud)