Join în C# (.NET)

Combină două secvențe după o cheie comună (inner join): fiecare pereche care se potrivește produce un rezultat.

Sintaxă C#
exterior.Join(interior, e => e.Id, i => i.ExteriorId, (e, i) => rezultat)

Ce face Join

Join face ce face INNER JOIN în SQL: pentru fiecare element din prima secvență caută elementele din a doua cu aceeași cheie și apelează funcția de rezultat pentru fiecare pereche. Elementele fără pereche nu apar în rezultat.

Primește patru argumente: a doua secvență, cheia din prima, cheia din a doua și funcția care construiește rezultatul. În sintaxa de interogare se scrie join o in comenzi on c.Id equals o.ClientId. Rezultatul urmează ordinea primei secvențe.

Pentru a păstra și elementele fără pereche (left join), folosește GroupJoin sau, din .NET 10, LeftJoin.

Parametri

Parametru Descriere
inner A doua secvență.
outerKeySelector / innerKeySelector Cheile comparate pentru egalitate.
resultSelector (exterior, interior) => ...: rezultatul pentru o pereche.

Exemple

Exemplul 1: Clienți și comenzi

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 rezultat = clienti.Join(comenzi,
    c => c.Id,
    o => o.ClientId,
    (c, o) => $"{c.Nume}: comanda {o.Id}, {o.Total} lei");

foreach (string r in rezultat)
    Console.WriteLine(r);

record Client(int Id, string Nume);
record Comanda(int Id, int ClientId, int Total);

Rezultat

Ana: comanda 101, 250 lei
Ana: comanda 103, 40 lei
Mihai: comanda 102, 90 lei

Exemplul 2: Sintaxa de interogare cu filtru

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 mari = from c in clienti
           join o in comenzi on c.Id equals o.ClientId
           where o.Total >= 50
           select new { c.Nume, o.Total };

foreach (var m in mari)
    Console.WriteLine($"{m.Nume} - {m.Total}");

record Client(int Id, string Nume);
record Comanda(int Id, int ClientId, int Total);

Rezultat

Ana - 250
Mihai - 90

Greșeli frecvente

  • În sintaxa de interogare, ordinea cheilor contează: on c.Id equals o.ClientId (prima sursă în stânga). Inversată, nu se compilează.
  • Așteptarea ca Ioana (fără comenzi) să apară în rezultat: Join este inner join.
  • == nu merge în join ... on; cuvântul cheie este equals.

Comenzi înrudite

  • GroupJoin și LeftJoin: GroupJoin leagă fiecare element de lista lui de potriviri (poate fi goală); LeftJoin din .NET 10 face direct un left join.
  • 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: Join

Ai o nelămurire despre utilizarea comenzii Join 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.