Comment faire une jointure externe complète dans Linq?
J'ai hérité d'une base de données qui n'a pas été conçu exactement de manière optimale, et j'ai besoin de manipuler des données. Permettez-moi de donner un plus commun analogie avec le genre de chose que j'ai à faire:
Disons que nous avons un Student
table, un StudentClass
table de garder trace de toutes les classes, il a assisté, et une StudentTeacher
table qui stocke tous les professeurs qui ont enseigné cette élève. Oui, je sais que c'est stupide de conception, et il serait plus logique de les stocker à l'enseignant de la Classe de la table, mais c'est ce à quoi nous travaillons avec.
Je veux maintenant nettoyer les données, et je veux trouver tous les endroits où un élève a un professeur, mais pas de classes, ou une classe, mais pas d'enseignants. SQL ainsi:
select *
from StudentClass sc
full outer join StudentTeacher st on st.StudentID = sc.StudentID
where st.id is null or sc.id is null
Comment faites-vous cela dans Linq?
- Remarque: ce n'est pas vraiment une jointure externe complète - puisque vous voulez exclure les lignes où la jointure interne réussi. Je suis juste de mentionner puisque c'est un premier résultat de recherche pour 'full outer join linq' - donc, si c'est ce que quelqu'un est à la recherche pour les réponses peuvent ne pas être de droite
- il pourrait être une solution de haute performance, reportez-vous ci-dessous à la question. stackoverflow.com/questions/5489987/linq-full-outer-join/...
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai la réponse ici, ce qui n'est pas aussi élégant comme je l'avais espéré, mais il devrait faire l'affaire:
Vous pourriez probablement serrer ces deux états en un seul, mais je pense que vous auriez du sacrifice du code de la clarté.
pour le 2 collections un et b, un nécessaire jointure externe complète pourrait être comme suit:
Si a et b ne sont pas du même type, puis séparer les 2 jointures externes gauches sont nécessaires:
ici est une option de ligne à l'aide de Concat():
a.Except(b).Concat(b.Except(a))
?Méthode d'Extension:
Test:
Un début...
Voir aussi http://www.linqpad.net/ pour plus d'échantillons
Bon outil pour jouer avec
Basé sur Shaul réponse, mais avec un peu de rationalisation:
Noter que pour une jointure externe complète, cela peut fonctionner, trop. Laissez le
where
clause et l'utilisation de la premièreselect
ci-dessus, plutôt que la seconde.