2010-10-29 87 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