Je dois effectuer une jointure à gauche dans plusieurs conditions où les conditions sont OR
s plutôt que AND
s. J'ai trouvé beaucoup d'échantillons de ce dernier mais j'ai du mal à trouver la bonne réponse pour mon scénario.Linq - jointure à gauche sur plusieurs conditions (OR)
from a in tablea
join b in tableb on new { a.col1, a.col2 } equals new { b.col1, b.col2 }
group a by a into g
select new() { col1 = a.col1, col2 = a.col2, count = g.Count() }
fonctionne très bien pour les jointures où toutes les conditions doivent correspondre. Je dois obtenir la jointure pour correspondre à on a.col1 = b.col1 OR a.col2 = b.col2
.
Je sais que ça doit être facile mais je n'ai rien trouvé sur ce sujet!
Edit:
Pour donner un peu plus d'information, dans le but de la requête est d'obtenir une projection contenant tous les champs de « a » plus un décompte des enregistrements correspondants dans « b ». J'ai modifié l'exemple ci-dessus pour essayer d'illustrer ce que je cherche. Quand je cours avec ce qui précède en utilisant l'approche Jon Skeet a noté que je reçois un compte de tous les enregistrements d'un, pas le nombre d'enregistrements liés en b.
La gauche base join ne fonctionne bien:
from a in tablea
from b in tableb
.Where(b => (a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
select new { col1 = a.col1, col2 = a.col2 }
Si je révise pour ajouter le regroupement comme ci-dessous
from a in tablea
from b in tableb
.Where(b => (a.col1 == b.col1 || a.col2 == b.col2))
.DefaultIfEmpty()
group a by a.col1 into g
select new { col1 = g.Key, count = g.Count() }
Je reçois le nombre des enregistrements renvoyés d'un - pas nombre d'enregistrements en correspondance dans b.
Edit:
Je vais vous donner la réponse à Jon - J'ai résolu mon problème de comptage - Je ne savais pas que je pouvais utiliser un lamda pour filtrer le nombre (g.Count(x => x != null))
. De plus, j'ai besoin de grouper b par un plutôt que par un comme je l'ai dit ci-dessus. Cela donne le résultat correct mais le SQL n'est pas aussi efficace que je l'écrirais à la main car il ajoute une sous-requête corrélée - si quelqu'un peut conseiller une meilleure façon de l'écrire pour simuler le SQL suivant je l'apprécierais!
select a.col1, count(b.col1)
from tablea a
left join tableb b
on a.col1 = b.col1
or a.col2 = b.col2
group by a.col1
Je vous suggère d'essayer ma requête * sans * le regroupement, et de voir si cela obtient les résultats que vous attendez. Si c'est le cas, essayez de déterminer pourquoi le regroupement échoue. Peut-être grouper par 'new {a.col1, a.col2}'? –
Fonctionne très bien en tant que jointure de base à gauche - le fait d'obtenir le compte en dehors du regroupement ne se comporte pas comme je le souhaiterais s'il s'agissait d'une équi-jointure de base. Notez les informations supplémentaires ci-dessus. –