Ce face GroupJoin și LeftJoin
GroupJoin seamănă cu Join, dar funcția de rezultat primește un element din prima secvență și toate elementele potrivite din a doua, ca o colecție. Elementele fără potrivire primesc o colecție goală, deci nu se pierd. E potrivit pentru totaluri pe client sau pentru o structură părinte-copii.
În sintaxa de interogare, GroupJoin este join ... into grup. Left join-ul clasic se scria cu join ... into urmat de from x in grup.DefaultIfEmpty().
Din .NET 10 există LeftJoin (și RightJoin): funcția de rezultat primește perechea, iar elementul din a doua secvență este null când lipsește potrivirea. Entity Framework Core 10 le traduce în SQL LEFT JOIN / RIGHT JOIN.
Exemple
Exemplul 1: Total pe client cu GroupJoin
Ioana nu are comenzi, dar apare în rezultat cu 0.
Client[] clienti = [new(1, "Ana"), new(2, "Mihai"), new(3, "Ioana")];
Comanda[] comenzi = [new(101, 1, 250), new(102, 2, 90), new(103, 1, 40)];
var totaluri = clienti.GroupJoin(comenzi,
c => c.Id,
o => o.ClientId,
(c, lista) => new { c.Nume, Numar = lista.Count(), Total = lista.Sum(o => o.Total) });
foreach (var t in totaluri)
Console.WriteLine($"{t.Nume}: comenzi {t.Numar}, total {t.Total} lei");
record Client(int Id, string Nume);
record Comanda(int Id, int ClientId, int Total);
Rezultat
Ana: comenzi 2, total 290 lei
Mihai: comenzi 1, total 90 lei
Ioana: comenzi 0, total 0 lei
Exemplul 2: LeftJoin (.NET 10)
Client[] clienti = [new(1, "Ana"), new(2, "Mihai"), new(3, "Ioana")];
Comanda[] comenzi = [new(101, 1, 250), new(102, 2, 90), new(103, 1, 40)];
var randuri = clienti.LeftJoin(comenzi,
c => c.Id,
o => o.ClientId,
(c, o) => $"{c.Nume}: {(o is null ? "fără comenzi" : $"comanda {o.Id}")}");
foreach (string r in randuri)
Console.WriteLine(r);
record Client(int Id, string Nume);
record Comanda(int Id, int ClientId, int Total);
Rezultat
Ana: comanda 101
Ana: comanda 103
Mihai: comanda 102
Ioana: fără comenzi
Greșeli frecvente
- Accesarea elementului din a doua secvență în
LeftJoinfără verificare denull: pentru clienții fără comenzi aruncăNullReferenceException. LeftJoinșiRightJoinnu există înainte de .NET 10; pe versiuni mai vechi foloseșteGroupJoin+SelectMany+DefaultIfEmpty.
Comenzi înrudite
Join: Combină două secvențe după o cheie comună (inner join): fiecare pereche care se potrivește produce un rezultat.SelectMany: Aplatizează colecții imbricate: din fiecare element ia o colecție și le lipește pe toate într-o singură secvență.EF Core: interogări (Where, Include, AsNoTracking): Interogările LINQ pe DbSet devin SQL: Where, Select, Include pentru relații, AsNoTracking pentru citire și ExecuteUpdate în masă.
Întrebări & Exemple de Cod:
GroupJoin și LeftJoinAi o nelămurire despre utilizarea comenzii
GroupJoin și LeftJoinsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.