2010-07-19 51 views
4

我有三个表,需要编写一个linq查询,它基于两个不同的联接从所有活动中提取。Linq加入三个表

  • 我需要在志愿者中ActivityVolunteers
  • 我需要的所有活动,其中OrganizationID是在活动表和志愿属于organizaiton(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() 
    }) 
+0

我想我正在寻找一个只提供不同的联盟。 – scottrakes 2010-07-19 20:12:19

+3

'联合'提供了独特的答案... – 2010-07-19 20:30:10

+0

这可能是有用的:http://stackoverflow.com/questions/8900077/linq-join-3-tables-with-or-condition/10784347#10784347 – Prasanna 2012-05-28 12:11:47

回答

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