我是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。
答案 0 :(得分:5)
如果它的LINQ-To-Objects很重要。
Enumerable.Where
与if
条款相当。所以这......
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事情的顺序,但除非你测量它,否则你无法确定。
我建议你不要担心,直到你在衡量表现时面对或知道某些事情。