2010-10-29 5 views
0

J'ai une instruction d'union linq qui m'a donné quelques problèmes et je ne peux pas voir où le problème est. Toute aide serait appréciée.Linq to SQL avec plusieurs syndicats

L'erreur est .... Toutes les requêtes combinées à l'aide d'un opérateur UNION, INTERSECT ou EXCEPT doivent avoir un nombre égal d'expressions dans leurs listes de cibles. Je sais que l'erreur signifie que je sélectionne différentes quantités d'éléments dans l'une des instructions linq, mais j'ai examiné cette requête de manière approfondie et je n'ai pas été en mesure de voir cela comme le problème.

(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

Je ne vois rien de mal à cette affirmation non plus - Avez-vous essayé de supprimer des déclarations individuelles de l'Union pour essayer de préciser quelle est la cause du problème? – davisoa

+0

Oui, j'ai essayé un tas de combinaisons différentes de syndicats et en supprimant les éléments sélectionnés. Je suis à la maison maintenant et je n'ai pas accès au projet mais je vais essayer de le faire demain. merci d'affirmer que je ne suis pas fou quand même. J'ai passé plus d'une heure sur cette seule déclaration qui n'a pris que quelques minutes pour écrire. Une autre chose que je ne pensais pas essayer est d'exécuter les instructions sous la forme de requêtes individuelles et de les agréger dans une base de données. Cela pourrait aussi faire la lumière. – eric

+0

Avez-vous essayé d'assigner chaque composant de l'Union à son propre local (avec l'inférence de type: type var) et de prendre l'Union sur les locaux. Cela vous permettra d'examiner les types de chacune des expressions de composants pour voir ce qui est différent. – Richard

Répondre

1

Je ne trouve pas le problème dans la requête. J'ai utilisé LINQPad et exécuté votre requête sur un modèle d'objet adhoc et il fonctionne sans se plaindre.

La seule chose que je peux suggérer est d'enlever la répétition. Espérons que l'erreur ne sera plus là.

Voici ma factorisation.

je fais une seule db.sysUsers requête:

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 } 

Je fais une seule requête sur 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 

Et voici la meilleure partie, une requête 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 

Et non w, la dernière requête:

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

J'espère que cela aide.

+0

Nous vous remercions de votre réponse. Je n'aurais jamais pensé à résoudre ce problème de cette façon. – eric