Linq加入三张桌子

时间:2010-07-19 20:08:42

标签: linq

我有三个表,需要编写一个linq查询,该查询根据两个不同的连接从所有活动中提取。

  • 我需要志愿者在ActivityVolunteers中存在的所有活动
  • 我需要所有活动,其中OrganizationID在Activity表中,志愿者属于组织者(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()
    })

1 个答案:

答案 0 :(得分:2)

(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 = ""
    })