Я использую .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