我是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.
如果它是LINQ-To-Objects则很重要.
Enumerable.Where与if条款相当.所以这 ...
if(expensiveMethodThatReturnsBool() && num1 < num2)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
...可能效率低于:
if(num1 < num2 && expensiveMethodThatReturnsBool())
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
因为&&是短路运营商.仅在第一个表达式返回时才计算第二个表达式true.同样适用于||,仅在第一次返回时评估第二个false.
它与链式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)
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |