Несколько внутренних соединений EF Linq с использованием вложенных подзапросов

Итак, у меня есть две таблицы Site и Contact, которые имеют отношения «многие ко многим» через таблицу ContactSites. Обе таблицы Site и Contact имеют логический атрибут Deleted. Я пытаюсь написать запрос LINQ, в котором перечислены все контакты с удаленным атрибутом = false и со связанными сайтами, которые также имеют удаленный атрибут = false

Вот код, который я использую:

from c in Contacts
where c.Deleted == false 
select new{c.LName, c.FName, SiteContactSites = 
                            (from cs in ContactSites
                            where cs.Contact_ID == c.ID
                            select new{ cs.Contact_ID,   cs.Site_ID, Sites = 
                                                                (from s in Sites 
                                                                where cs.Site_ID == s.ID &&
                                                                s.Deleted == false 
                                                                select cs).First()}).First()}

но результаты, похоже, действуют как внешнее соединение по сравнению с внутренним соединением, которое я хочу.

Я специально ищу способ сделать это с вложенными подзапросами, а не с соединениями, которые будут:

from c in Contacts
join cs in ContactSites on c.ID equals cs.Contact_ID
join s in Sites on  cs.Site_ID equals s.ID
where c.Deleted == false && s.Deleted == false
select c

Любая помощь приветствуется


person user2129585    schedule 19.06.2013    source источник
comment
Работает ли второй — простой и лаконичный — пример кода? Если да, то зачем вам подзапросы?   -  person lisp    schedule 19.06.2013
comment
хорошо, второй пример кода работает при написании в linqpad, но не работает в C# vs2012, так как нет модели для ContactSites   -  person user2129585    schedule 19.06.2013
comment
но тогда и первый запрос тоже не сработает, потому что вы присоединяетесь к ContactSites.   -  person lisp    schedule 19.06.2013
comment
ну, оба запроса работают в linqpad, другими словами, они возвращают данные... второй возвращает правильные данные... вы правы, что ни один из них не работает в VS C#, так как нет модели для таблицы пересечений... но что я могу сделать, чтобы решить эту   -  person user2129585    schedule 19.06.2013
comment
Создайте объект ContactSite и добавьте его в контекст, из которого вы запрашиваете...   -  person Ocelot20    schedule 19.06.2013


Ответы (1)


Таким образом, следующее делает свое дело:

from c in db.Contacts
from co in c.Communities
where co.Deleted == false
select c

Все это находится в свойствах навигации, когда вы используете LINQ to Entities, поэтому присоединение происходит по адресу «from co in c.Communities». Я думаю, что мое замешательство было в том, что я использовал LinqPAD, который использует LINQ to SQL.

эта ссылка была полезной и прояснила для меня вещи:

http://peter.hahndorf.eu/blog/post/2010/12/31/UsingLinqInManytomanySelectScenarios

person user2129585    schedule 20.06.2013