Ho bisogno di fare un join di sinistra su più condizioni in cui le condizioni sono OR
s anziché AND
s. Ho trovato molti esempi di quest'ultimo, ma sto lottando per ottenere la risposta giusta per il mio scenario.Linq - left join su più condizioni (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() }
funziona perfettamente per i join in cui tutte le condizioni devono corrispondere. Ho bisogno di ottenere il join per abbinare on a.col1 = b.col1 OR a.col2 = b.col2
.
So che dev'essere facile, ma mi è venuto in mente questo!
Edit:
Per dare un po 'più di informazioni, lo scopo della query è quello di ottenere una proiezione che contiene tutti i campi da 'A' e un conteggio dei record corrispondenti in 'b'. Ho modificato l'esempio sopra per cercare di illustrare ciò che sto cercando. Quando corro con quanto sopra usando l'approccio Jon Skeet ha notato che sto ottenendo un conteggio di tutti i record da un numero, non il conteggio dei record correlati in b.
La base LEFT JOIN funziona bene:
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 }
Se gli modifico per aggiungere il raggruppamento, come di seguito
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() }
sto ottenendo il conteggio dei record restituiti da una - non è il conteggio dei record in corrispondenza in b.
Edit:
darò la risposta a Jon - Ho risolto il mio problema di conteggio - non avevo capito che potevo usare una lambda per filtrare il conteggio (g.Count(x => x != null))
. Inoltre ho bisogno di raggruppare b da un piuttosto che da un come sopra. Questo dà il risultato corretto ma SQL non è efficiente come lo scriverei a mano in quanto aggiunge una sottoquery correlata - se qualcuno può consigliare un modo migliore di scriverlo per simulare il seguente SQL, lo apprezzerei!
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
Ti suggerisco di provare la mia query * senza * il raggruppamento e vedere se questo sta ottenendo i risultati che ti aspetti. Se lo fa, prova a capire perché il raggruppamento stia fallendo. Magari raggruppa per 'new {a.col1, a.col2}'? –
Funziona bene come selezione di sinistra di base select - ottenere il conteggio del gruppo non si comporta come mi aspetterei se fosse un equi-join di base. Nota le informazioni extra sopra. –