Как определить, следует ли использовать join в linq to sql? - PullRequest
4 голосов
/ 21 октября 2011

Мне просто интересно, как мы можем определить, использовать ли join или нет в linq to sql.

Например. скажем, если у нас есть две таблицы, как это

Table 1   Customer
          id
          name

Table 2   addresstype
          id
          address1
          customerid

и

var address = from cu in Customer
              from ad in addresstype
              where cu.id == ad.customerid
              select ad;

или

var address = from cu in Customer
              join ad in addresstype on cu.id equals ad.customerid
              select de;

Оба пути одинаковы. Есть ли разница в производительности?

Кроме того, второй метод: возникнет ли ошибка, если совпадений нет?

Ответы [ 5 ]

3 голосов
/ 21 октября 2011

Вы используете linq для сущностей или linq для SQL?Если это первое, то вы можете избежать обоих из них, определив свои отношения в модели и используя свойства навигации.Это был бы самый ясный способ сделать вещи

2 голосов
/ 21 октября 2011

По сути, эти два запроса LINQ эквивалентны следующим запросам SQL:

 select ad.*
 from Customer cu, AddressType ad
 where cu.ID == ad.CustomerID -- I assume this was meant by the OP

и

select ad.*
from Customer cu
  inner join AddressType ad on cu.id = ad.CustomerID;

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

Я бы предпочел синтаксис join как в SQL, так и в LINQ, поскольку он определяет явную связь между двумя таблицами / сущностями, что подразумевается только в версии без соединения.

1 голос
/ 21 октября 2011

Чтобы добавить третий и более предпочтительный метод в соединение с LINQ to SQL, используйте ассоциации между таблицами (даже если они не установлены в вашей базе данных).Имея это в виду, вы можете перемещаться по графу объектов вместо использования объединений:

var query = from cu in Customer 
              from ad in cu.Addresses 
              select ad; 

Примечание: при запросе к графам объектов LINQ to SQL переводит объединение в левое внешнее объединение где-как объединение /где синтаксис по умолчанию является внутренним соединением.

Соединения в LINQ следует использовать, когда между объектами нет естественной связи.Например, используйте объединение, если вы хотите просмотреть список магазинов, которые находятся в том же городе, что и ваши клиенты.(Присоединитесь к Customer.Address.City с Store.Address.City).

1 голос
/ 21 октября 2011

Это, похоже, один и тот же запрос, они возвращают один и тот же результат, но я не знаю, какой из них может быть быстрее, он должен быть помечен как стендовый.подзапрос над соединением, потому что в настоящее время, если вы хотите проверить элемент уравнения два, вы должны использовать синтаксис:

new {X,Y} equals new {X',Y'}

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

0 голосов
/ 21 октября 2011

Между этими двумя запросами не должно быть различий.Я на самом деле задавался этим вопросом сам несколько месяцев назад.Я подтвердил это через LINQPad.Это бесплатный инструмент, который вы можете загрузить и фактически увидеть сгенерированный SQL любого запроса LINQ (это запрос, который отправляется в базу данных).

Сгенерированный SQL должен быть одинаковым для этих двух запросов.

Если вы делаете это через Visual Studio, есть также способ просмотреть сгенерированный SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...