2013-03-14 3 views
1

У меня есть 3 набора объектов EF: родители, дети и домашние животные, с ассоциациями «один-ко-многим» (у родителя может быть майн. У детей и детей может быть много домашних животных). Для данного Родительства мне нужно получить все домашние животные, которые принадлежат всем этим родителям.Запрос LINQ to Entities по связанным объектам

Я беспокоюсь, если этот запрос является правильным, или он может быть более эффективным:

Dim query = From par In context.Parents 
      From child In par.Childrens 
      From pet In child.Pets 
      Where par.parent_id = 1 
      Select pet 

ответ

0

Этот запрос является правильным, хотя сво cross-join - это просто Cartesian product двух множеств -.

Вы можете явно указать join на основании условия equality.

var query = from par in context.Parents 
      join child in context.Childrens on child.ParentID equals par.ID 
      join pet in context.Products on child.ID equals pet.ChildID 
      Where par.parent_id = 1 
      select new { par.Name, par.Id }; 
+0

Хорошо, это более эффективный способ запросить такую ​​вещь? Я думал, что в LINQ явное определение объединений не понадобится. – Nuts

+0

В вашем запросе будет создан набор записей, который показывает все возможные комбинации между двумя таблицами. Это проблемы производительности с большими наборами. Ваши необходимые результаты не нужны. Подробнее http://geekswithblogs.net/berthin/archive/2012/05/25/how-to-perform-cross-join.aspx - http://www.c-sharpcorner.com/UploadFile/3d39b4/inner- join-cross-join-and-left-external-join-with-linq-to-sql/ – MuhammadHani

+0

Спасибо. Спектакль был моей проблемой здесь, и, по крайней мере, вы поставили меня в правильном направлении. – Nuts