Je suis nouveau sur LINQ. Quelqu'un pourrait-il s'il vous plaît préciser si l'ordre des conditions dans la clause where dans une requête LINQ est important.
par exemple: Y a-t-il une différence de performance entre les deux requêtes ci-dessous
Requête-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
}
Requête-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
}
Edit : Je viens de mesurer la performance. Query-1 prend environ 900 ms tandis que Query-2 prend 350 ms.
Si c'est LINQ-To-Objects, c'est important.
Enumerable.Where
est comparable à une if
clause. Donc ça ...
if(expensiveMethodThatReturnsBool() && num1 < num2)
{
// ...
}
... est probablement moins efficace que:
if(num1 < num2 && expensiveMethodThatReturnsBool())
{
// ...
}
parce que &&
c'est un opérateur de court-circuit. La deuxième expression est évaluée uniquement si la première est renvoyée true
. Il en va de même pour ||
, le second n'est évalué que si le premier est retourné false
.
7.11 Opérateurs logiques conditionnels
Il en va de même avec l' Where
art enchaîné . Similaire car les prédicats sont appliqués à chaque élément restant qui est passé par le précédent Where
.
Donc ça...
.Where(x => expensiveMethodThatReturnsBool(x))
.Where(x => x.num1 < x.num2)
peut également être moins efficace que:
.Where(x => x.num1 < x.num2)
.Where(x => expensiveMethodThatReturnsBool(x))
Le premier équivaut logiquement à:
.Where(x => expensiveMethodThatReturnsBool(x) && x.num1 < x.num2)
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots