2010-08-03 5 views
0

Яркая загрузка объектов в Linq2Sql

Я пытаюсь с нетерпением загрузить объект и связанные с ним свойства (базовые для многих) с помощью LoadWith и AssociateWith DataLoadOptions. Однако, посмотрев на сгенерированный SQL, я заметил, что операторы, созданные LoadWith, - это все внешние соединения слева.

Таким образом, приведенный ниже код генерирует все левые внешние соединения для извлечения данных связанных свойств. Почему это? И есть ли способ получить LoadWith для создания внутренних соединений. Я знаю, что могу сделать это с помощью простого «Linq join», однако мне нравится, насколько чистый и простой синтаксис LoadWith. Заранее спасибо

dataLoadOptions.LoadWith(Of TCustomer)(Function(c) c.Orders) 
dataLoadOptions.LoadWith(Of TOrder)(Function(o) o.Products) 
dataLoadOptions.LoadWith(Of TProduct)(Function(p) p.ProductTranslations) 
dataLoadOptions.AssociateWith(Of TProduct)(Function(c) c.ProductTranslations.Where(Function(t) t.Language = "En")) 
+0

Почему вы хотите внутренние соединения. Кажется довольно разумным, что LINQ to SQL генерирует внешние соединения, потому что с внутренними соединениями клиент, который не имеет заказов, не будет получен. Возможно, вам следует объяснить, чего вы хотите достичь. – Steven

+0

Да, извините, я должен был быть более ясным. Я хочу вернуть все заказы клиента, для которых существует перевод на английский язык. Что касается внешних объединений, я думаю, что Linq должен позволить мне явно построить либо внешнее, либо внутреннее соединение. Извините Если это еще не ясно. – Buzzer

ответ

0

заказов всех клиентов для которых перевод продукта Английский существует

dataLoadOptions.AssociateWith<TCustomer>(c => c.Orders 
    .Where(o => o.Products 
     .SelectMany(p => p.ProductTranslations) 
     .Any(pt => pt.Language == "En") 
) 
); 
+0

Это привело меня к правильному пути. Спасибо за информацию Дэвида! – Buzzer

 Смежные вопросы

  • Нет связанных вопросов^_^