【问题标题】:Linq Join across three tables跨三个表的 Linq Join
【发布时间】:2010-07-19 20:08:41
【问题描述】:

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

  • 我需要 ActivityVolunteers 中存在志愿者的所有活动
  • 我需要OrganizationID 在Activity 表中并且志愿者属于组织(OrganizationVolunteers) 但不在ActivityVolunteers 中的所有活动。志愿者可能不属于活动,但属于组织。

下面是我尝试编写 Linq 的表结构。

活动
  • 活动 ID
  • 活动名称
  • 组织 ID
活动志愿者
  • 活动 ID
  • 志愿者编号
  • 活动角色
组织志愿者
  • 组织 ID
  • 志愿者编号

这是我在 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()
    })

【问题讨论】:

标签: linq


【解决方案1】:
(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 = ""
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2012-06-12
    • 2020-10-25
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多