Вопрос: Linq Присоединяйтесь к трем таблицам


У меня три таблицы, и мне нужно написать запрос linq, который извлекает из всех Деяний на основе двух разных объединений.

  • Мне нужны все действия, в которых добровольцы существуют в ActivityVolunteers
  • Мне нужны все действия, в которых идентификатор OrganizationID находится в таблице деятельности, а волонтер принадлежит организатору (OrganizationVolunteers), но не в ActivityVolunteers. Волонтер может не принадлежать к этой деятельности, но принадлежит к организации.

Ниже представлена ​​структура таблицы и моя попытка написать Linq.

мероприятия
  • ActivityID
  • ActivityName
  • OrganizationID
ActivityVolunteers
  • ActivityID
  • VolunteerID
  • ActivityRole
OrganizationVolunteers
  • OrganizationID
  • VolunteerID

Вот моя слабая попытка в linq, я не могу понять, как присоединиться к двум наборам результатов, чтобы получить уникальные действия.

from a in Activities
join av in ActivityVolunteers on a.ActivityID equals av.ActivityID 
where av.VolunteerID==1
select new 
    {
        a.ActivityID,
        a.ActivityName,
        av.ActivityRole,
        a.OrganizationID
    }

from org in (from a in Activities
join ov in OrganizationVolunteers on a.OrganizationID equals ov.OrganizationID
where ov.VolunteerID==1
select new 
    {
        a.ActivityID,
        a.ActivityName,
        ActivityRole = "Prospect",
        a.OrganizationID
    })
select org
Я попробовал объединение, но он дублирует записи.
(from a in Activities
join av in ActivityVolunteers on a.ActivityID equals av.ActivityID 
where av.VolunteerID==1
select new 
    {
        a.ActivityID,
        a.ActivityName,
        av.ActivityRole,
        a.OrganizationID,
        OrganizationName = (from o in Organizations where o.OrganizationID == a.OrganizationID select o.OrganizationName).FirstOrDefault()
    }).Union
    (from a in Activities
join ov in OrganizationVolunteers on a.OrganizationID equals ov.OrganizationID
where ov.VolunteerID==1
select new 
    {
        a.ActivityID,
        a.ActivityName,
        ActivityRole = "Prospect",
        a.OrganizationID,
        OrganizationName = (from o in Organizations where o.OrganizationID == a.OrganizationID select o.OrganizationName).FirstOrDefault()
    })

4


источник


Ответы:


(from a in Activities
join ov in OrganizationVolunteers on a.OrganizationID equals ov.OrganizationID
join av in ActivityVolunteers
on a.ActivityID equals av.VolunteerID into JoinedActVol
from av in JoinedActVol.DefaultIfEmpty()
where ov.VolunteerID==1
select new 
    {
        a.ActivityID,
        a.ActivityName,
        av.ActivityRole,
        a.OrganizationID,
        OrganizationName = (from o in Organizations where o.OrganizationID == a.OrganizationID select o.OrganizationName).FirstOrDefault()
    }).Union
    (from a in Activities
join av in ActivityVolunteers on a.ActivityID equals av.ActivityID 
where av.VolunteerID==1 && a.OrganizationID == null
select new 
    {
        a.ActivityID,
        a.ActivityName,
        av.ActivityRole,
        a.OrganizationID,
        OrganizationName = ""
    })

2