WORDS
Introduktion till Linq: join
Nu ska vi gå igenom hur man kan matcha ihop två listor med hjälp av join
, en del av Linq (Language Integrated Query).
Enkel join
, för uppdatering
Motsvarande i SQL:
INNER JOIN
(synonym:JOIN
).
Om du har koll på JOIN
i SQL, så kommer du känna igen det i Linq också.
I dom flesta fall, tycker jag att syntaxen med tilläggsmetoder (eng. extension methods) såsom Join()
är tydligare, men join
utgör ett undantag. Därför kommer vi gå igenom frågesyntaxen.
Låt säga att du har en lista med hundar, som användaren kan uppdatera från ett GUI. Hur vet man vilka hundar i databasen som ska uppdateras?
public class Example
{
/// <summary>
/// Vi får in två listor: hundarna i databasen och hundar
/// som användaren fyllt i via ett GUI ("input"). Här
/// uppdaterar vi hundarna i databasen med den nya
/// informationen.
/// </summary>
public void UpdateDogs(IEnumerable<Dog> dbDogs, IEnumerable<Dog> inputDogs)
{
var matchedDogs =
// Utgå från listan `dbDogs`, och kalla varje
// element i listan för en `dbDog`.
from dbDog in dbDogs
// Matcha ihop detta med listan `inputDogs`, och
// kalla varje element i den listan för en
// `inputDog`.
join inputDog in inputDogs
// Element i listorna ska matchas med
// `dbDog.Id` från ena listan, och
// `inputDog.Id` från den andra.
on dbDog.Id equals inputDog.Id
// Välj ut ett nytt objekt utifrån matchningen.
// Det blir ett anonymt objekt där vi döper en
// property till `DbDog` och den andra till
// `InputDog`, med värden från elementen i
// listorna.
select new
{
DbDog = dbDog,
InputDog = inputDog,
};
foreach (var x in matchedDogs)
{
// `x` innehåller ett anonymt objekt, vilket vi
// definierade i `select` här ovanför.
Dog dbDog = x.DbDog;
Dog inputDog = x.InputDog;
// Uppdatera hunden från databasen, med
// information som användaren har angett.
dbDog.Name = inputDog.Name;
dbDog.Breed = inputDog.Breed;
}
// ...spara...
}
}
Mer
I ett framtida inlägg går vi igenom fler exempel på join
, och också visa hur man kan göra det med tilläggsmetoder.