В чем разница между Where и Join в linq?

В чем разница между этими двумя запросами? они полностью равны?

from order in myDB.OrdersSet
    from person in myDB.PersonSet
    from product in myDB.ProductSet
    where order.Persons_Id==person.Id && order.Products_Id==product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

а также

from order in myDB.OrdersSet
    join person in myDB.PersonSet on order.Persons_Id equals person.Id
    join product in myDB.ProductSet on order.Products_Id equals product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

person Freshblood    schedule 10.06.2010    source источник
comment
почему вы обозначили вопрос как сущность-структура? возможно, вы используете linq в рамках сущности, но это общий вопрос linq, а не ef.   -  person erasmus    schedule 10.06.2010
comment
Да, я думал о том, что вы сказали. Я не эксперт, и я никогда не использовал объединение в обычных запросах linq, когда я начал изучать структуру Entity, я увидел это и подумал, что метод соединения может зависеть от EF. Теперь я понимаю, что это не EF вопрос, поэтому я удаляю этот тег сейчас.   -  person Freshblood    schedule 10.06.2010


Ответы (2)


Конечный результат должен быть таким же.

Но использование JOIN понятнее - более очевидно, что вы делаете (объединяете три набора данных).

Мой личный подход к «лучшей практике» будет следующим:

  • используйте WHERE, чтобы уменьшить и ограничить количество возвращаемых строк - обычно это ограничивает один набор данных (путем определения некоторых критериев, которые должны быть выполнены)

  • используйте JOIN, чтобы выразить намерение объединить две таблицы/наборы данных вместе в общем поле (или наборе полей)

person marc_s    schedule 10.06.2010

Присоединение показывает взаимосвязь между таблицами более четко, а также при меньшем количестве нажатий клавиш.

person erasmus    schedule 10.06.2010
comment
Это хорошо согласуется с философией LINQ: предпочитайте ясность кода скорости выполнения. Особенно, когда в более понятном коде нет потери скорости, конечно :-) - person Gorpik; 10.06.2010
comment
Эта ясность может вызвать такие вопросы, как я спрашивал. Потому что, если где выполняется вся работа по соединению, то в чем разница между ними. Если нет разницы, то почему существует соединение :) - person Freshblood; 10.06.2010
comment
ясность в том, что когда вы используете объединение, вы используете более высокую абстракцию. однако, где его основная реализация. Кроме того, это не стиль linq, где и присоединяются. это потому, что в sql есть и то, и другое. - person erasmus; 10.06.2010
comment
Соединение имеет ограничения для отношений таблиц, когда их нет. Это может создать проблемы. Присоединяйтесь только к оператору Equals, в то время как там поддерживаются многие логические операторы. - person Freshblood; 10.06.2010