gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:07:21 24 4
gpt4 key购买 nike

我是 LINQ 的新手。谁能澄清 LINQ 查询中 where 子句下的条件顺序是否重要。

例如:下面两个查询之间的 w.r.t 性能有什么不同

查询-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 大约需要 900 毫秒,而 Query-2 需要 350 毫秒。

最佳答案

如果是 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)

关于c# - LINQ 查询中 where 子句下的条件顺序是否重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25398513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com