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:
Joineste inner join. ==nu merge înjoin ... on; cuvântul cheie esteequals.
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ă.
Întrebări & Exemple de Cod:
JoinAi o nelămurire despre utilizarea comenzii
Joinsau 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.