2010-10-29 85 views
0

我有一个linq union语句,一直给我一些麻烦,我看不出问题在哪里。任何帮助,将不胜感激。Linq to SQL与多个联盟

错误是...... 使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在目标列表中必须具有相同数量的表达式。

我知道这个错误意味着我在LINQ语句中的一个选择不同量的元素,但我已经广泛地研究这个查询,我一直没能看到,因为这个问题。

(From m In db.mainIncidents _ 
            Join r In db.rcas On r.reliabilityID Equals m.reliabilityID _ 
            Join team In db.rcaInvestigationTeams On team.rcaID Equals r.rcaID _ 
            Join user In db.sysUsers On team.teamMemberID Equals user.sysUserID _ 
            Where m.reliabilityID = reliabilityID _ 
            And team.deleted = False _ 
            Select name = user.firstName & " " & user.lastName & " (" & user.id.ToUpper & ")", _ 
            email = user.id & "@test.com", _ 
            user.phone, _ 
            isSponsor = "No", _ 
            isFacilitator = "No", _ 
            isAssetTeamLead = "No").Union _ 
           (From m In db.mainIncidents _ 
            Join r In db.rcas On r.reliabilityID Equals m.reliabilityID _ 
            Join at In db.sysUsers On r.assetTeamLeadID Equals at.sysUserID _ 
            Where m.reliabilityID = reliabilityID _ 
            Select name = at.firstName & " " & at.lastName & " (" & at.id.ToUpper & ")", _ 
            email = at.id & "@test.com", _ 
            at.phone, _ 
            isSponsor = "No", _ 
            isFacilitator = "No", _ 
            isAssetTeamLead = "Yes").Union _ 
           (From m In db.mainIncidents _ 
            Join r In db.rcas On r.reliabilityID Equals m.reliabilityID _ 
            Join f In db.sysUsers On r.facilitatorID Equals f.sysUserID _ 
            Where m.reliabilityID = reliabilityID _ 
            Select name = f.firstName & " " & f.lastName & " (" & f.id.ToUpper & ")", _ 
            email = f.id & "@test.com", _ 
            f.phone, _ 
            isSponsor = "No", _ 
            isFacilitator = "Yes", _ 
            isAssetTeamLead = "No").Union _ 
           (From m In db.mainIncidents _ 
            Join r In db.rcas On r.reliabilityID Equals m.reliabilityID _ 
            Join s In db.sysUsers On r.sponsorID Equals s.sysUserID _ 
            Where m.reliabilityID = reliabilityID _ 
            Select name = s.firstName & " " & s.lastName & " (" & s.id.ToUpper & ")", _ 
            email = s.id & "@test.com", _ 
            s.phone, _ 
            isSponsor = "No", _ 
            isFacilitator = "No", _ 
            isAssetTeamLead = "No") 
+0

我没有看到这个声明有什么问题 - 你是否尝试删除个别的联合声明来试图缩小哪一个导致问题? – davisoa 2010-10-29 02:55:33

+0

是的,我试过一堆不同组合的工会,也删除了选定的元素。我现在在家,无法进入该项目,但明天我会再试一次。谢谢你确认我不是疯了。我花了一个多小时在这个只需要几分钟就能写出的陈述上。我没有想到的另一件事是将这些语句作为单独的查询运行,并将它们汇总到一个数据表中。这也可能带来一些亮点。 – eric 2010-10-29 06:09:03

+0

你试过分配给自己的本地联盟的每个组件(具有类型推断:类型VAR),然后采取联盟在当地人。这将允许您检查每个组件表达式的类型以查看哪个是不同的。 – Richard 2010-10-29 09:51:43

回答

1

我在查询中找不到问题。我已经使用LINQPad并针对adhoc对象模型运行您的查询,并且运行时没有抱怨。

我只能建议删除重复。希望那么错误将不再存在。

这是我的保理。

我做单db.sysUsers查询:

Dim users = 
    From u In db.sysUsers 
    Select New With { _ 
     .userId = u.id, _ 
     .name = u.firstName & " " & u.lastName & " (" & u.id.ToUpper & ")", _ 
     .email = u.id & "@test.com", _ 
     .phone = u.phone } 

我做db.mainIncidents & db.rcas一个查询:

Dim rcas = 
    From m In db.mainIncidents _ 
    Where m.reliabilityID = reliabilityID _ 
    Join r In db.rcas On r.reliabilityID Equals m.reliabilityID _ 
    Select r 

这里是最好的部分,一个Role查询:

Dim roles = 
    From r In rcas _ 
    From role in (_ 
    { _ 
     New With { .userId = r.assetTeamLeadID, .role = "AssetTeamLead" }, _ 
     New With { .userId = r.facilitatorID, .role = "Facilitator" }, _ 
     New With { .userId = r.sponsorID, .role = "Sponsor" } _ 
    }).Concat(From team In db.rcaInvestigationTeams _ 
     Where team.deleted = False _ 
     Where team.rcaID = r.rcaID _ 
     Select New With { .userId = team.teamMemberID, .role = "TeamMember" }) _ 
    Select role 

而且不W,最后的查询:

Dim query = 
    From u In users _ 
    Join r In roles On u.userId Equals r.userId _ 
    Select u.name, u.email, u.phone, _ 
    isSponsor = If(r.role = "Sponsor", "Yes", "No"), _ 
    isFacilitator = If(r.role = "Facilitator", "Yes", "No"), _ 
    isAssetTeamLead = If(r.role = "AssetTeamLead", "Yes", "No") 

我希望这有助于。

+0

感谢您的回复。我从来没有想过要这样解决这个问题。 – eric 2010-10-29 18:21:41