Linq Вопрос - Почему здесь используется внешнее соединение? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть следующий запрос из базы данных AdventureWorks

from customer in Customer
where customer.CustomerID == 20042
select new { 
 customer.AccountNumber, 
 Order = from order in customer.SalesOrderHeader
   select new { order }
 }

Таблица Customer имеет отношение 1: M к SalesOrderHeader.Результирующий T-SQL выполняет внешнее левое соединение с таблицей SalesOrderHeader.Может кто-нибудь сказать мне, почему?И что, если бы я хотел вместо этого внутреннего соединения.Как бы я изменил этот запрос?

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Если вы хотите внутреннее соединение, используйте это:

from customer in Customer
where customer.CustomerID == 20042
from order in customer.SalesOrderHeaders
select new { customer.AccountNumber, Order = order }

Если вы хотите просто отфильтровать клиентов, у которых нет SalesOrderHeaders, используйте это:

from customer in Customer
where customer.CustomerID == 20042
where customer.SalesOrderHeaders.Any()
select new {  
 customer.AccountNumber,  
 Order =
   from order in customer.SalesOrderHeaders
   select order
} 
1 голос
/ 09 ноября 2010

Даже если это один-ко-многим, вы все равно должны допустить, чтобы он был один-к-одному.То есть клиент может не иметь заказов. Если вы не выполните внешнее объединение, вы не получите никаких записей вообще, если у этого конкретного клиента нет заказов.

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