Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

GroupJoin și LeftJoin în C# (.NET)

LINQ (Language Integrated Query) .NET Framework 3.5 (LeftJoin: .NET 10) Q&A / Distribuie cod

GroupJoin leagă fiecare element de lista lui de potriviri (poate fi goală); LeftJoin din .NET 10 face direct un left join.

Sintaxă C#
clienti.GroupJoin(comenzi, c => c.Id, o => o.ClientId, (c, lista) => ...)   clienti.LeftJoin(comenzi, ..., (c, o) => ...)

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 LeftJoin fără verificare de null: pentru clienții fără comenzi aruncă NullReferenceException.
  • LeftJoin și RightJoin nu există înainte de .NET 10; pe versiuni mai vechi folosește GroupJoin + 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ă.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: GroupJoin și LeftJoin

Ai o nelămurire despre utilizarea comenzii GroupJoin și LeftJoin sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.