Выбор нескольких связей «один ко многим» в LINQ to SQL с использованием внешних объединений - PullRequest
0 голосов
/ 22 июля 2010

Я использую .NET 4 и VS 2010 и имею ту же проблему в .NET 3.5 / VS 2008

Структура:
Таблица 1: Вызов
Таблица 2: AddressChangeRequest
Таблица 3: CallNotes

Один вызов может иметь много AddressChangeRequests и много CallNotes.Клиент (customerKey) может иметь много вызовов.

Код LINQ:
return db.Calls.Where (c => c.CustomerKey == '...'). Выбрать (c => новый вызов (c.CustomerKey, c.StartTime), c.AddressChangeRequests, c.CallNotes));

Call - это объект домена, который ожидает список AddressChangeRequests и CallNotes.Код возвращает список вызовов, как и ожидалось, однако SQL не является оптимальным.

Приведенный выше код генерирует SQL как один SELECT из таблицы Call с левым внешним соединением в таблице AddressChangeRequest, за которым следуют отдельные запросы SELECT из таблицы CallNote (по одному на каждый связанный Call)

Select ... from Call as c
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId

Select ... from CallNote Where callId = 123
Select ... from CallNote Where callId = 456
Select ... from CallNote Where callId = 789

Если я удаляю AddressChangeRequests из кода, для таблицы CallNote генерируется левое внешнее соединение, и отдельные операторы Select больше не генерируются.

Мой вопрос заключается в том, как с помощью LINQ генерировать один оператор SQLследующим образом:

Select ... from Call as c
LEFT OUTER JOIN AddressChangeRequest as acr ON c.id = acr.callId
LEFT OUTER JOIN CallNote as cn ON c.id = cn.callId

1 Ответ

0 голосов
/ 09 февраля 2011

Ответ, к сожалению, "нет".Поддержка загрузки L2S примитивна.Однако вы можете создать свою собственную версию поверх стандартных возможностей запросов.

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