2013-03-21 2 views
3

У меня есть этот запросЕсть ли реальная разница между «и» и «Wheres» в LINQ

from a in objects 
where a.property1 == 2 
&& a.property2 == 3 
select a 

и

from a in objects 
where a.property1 == 2 
where a.property2 == 3 
select a 

мне было интересно, есть ли реальная разница в том, как заявления выполняются ли какие-либо функции с использованием либо

На данный момент мой вопрос касается линков по объектам

+2

Linq для объектов, объектов, xml, sql? –

+0

Я не знал, что вы можете использовать 'where' дважды, как вы его используете. –

+0

@Burb, результатом будет просто цепочка вызовов Where .Where (...). Где (...) ' –

ответ

4

Ваш первый случай будет преобразован:

objects.Where(a => a.property1 == 2 && a.property2 == 3); 

в то время как последний один будет преобразован:

objects.Where(a => a.property1 == 2).Where(a => a.property2 == 3); 

Разница заключается в том, что последний будет фильтроваться в два раза, в то время как первый из них делает сравнения в лямбда.

Предполагается, что это LINQ-to-Objects; другие поставщики будут зависеть от реализации.

0

На практике два оператора идентичны, поскольку C# оценивает только правую часть операции И, если левая сторона является истинной.

Если C# не ленился с оценкой AND, последовательные оценки WHERE могли бы обеспечить довольно значительное повышение производительности в тех случаях, когда большинство элементов не удовлетворяют первому критерию (или второй критерий является дорогостоящей оценкой). Однако, как бы то ни было, C# по умолчанию ленив и, таким образом, сравнивается с лениво оцененным LINQ.

+0

Если C# не лениво оценивали' && ', тогда LINQ просто проверил бы оба свойства, прежде чем принимать элемент в результат. Очень сложно сказать, что выполнение этого будет выполняться лучше, чем цикл по первому результату, а затем снова фильтровать (вызывая больше выделения памяти), потому что все меняется. Я бы предположил, что первый будет быстрее в большинстве случаев - все это за один проход - особенно потому, что он немедленно уменьшит размер списка, что означает меньшую память, выделенную для него внутри. Поскольку он ленив, тогда в большинстве случаев он будет быстрее. – pickypg

0

Если разница зависит от базового поставщика LINQ. Поставщик LINQ отвечает за перевод вашего запроса LINQ в базовое функциональное представление, например SQL.

Настоящая разница для меня - читаемость. Две цепи, где утверждения уменьшают читаемость.

Смежные вопросы