A felhőalapú technológiákra váltás egy izgalmas kihívás - ha tudod miként kezdj neki! Ebben a cikkben szeretném megosztani...
LINQ: SQL szerű keresés gyűjteményekben
Gulyás GáborSzámos fejlesztési projekt kapcsán lehet szükségünk egy gyűjteményben – legyen az egy tömb, vagy éppen lista, bármilyen gyűjtemény – való keresésre. Az egyszerű eseteknél még a probléma egyszerűen megoldhatóvá válik ciklusok használatával, de mi a helyzet a komplexebb esetekkel?
Képzeljünk el egy alkalmazást, mely egy ügyféladatbázis kezelését biztosítja a felhasználó számára. Vannak benne ügyfeleink, tároljuk a hozzájuk kapcsolódó projektjeinket, a projektekhez feladatokat. Ha meg akarunk keresni egy ügyfelet név alapján, azt egyszerűen megoldhatjuk egy for, foreach, vagy while ciklussal.
De vegyünk egy másik esetet: vegyük azokat az ügyfeleket, akiknek a neve A-val kezdődik, ezen ügyfeleknek vegyük a projektjeit, melyeknél van legalább egy feladat. Na és erre hány for, foreach és while ciklust kéne írnunk? 🙂 A jó hír, hogy a C#-ban – vagy éppen Visual Basic-ben – egyet sem.
És akkor jött a LINQ
A LINQ a Language-Integrated Query rövidítése, melyet magyarul egy a nyelvbe integrált lekérdező nyelvként fordíthatnánk le. Ha ismerős számunkra az SQL szintaktika, akkor már nyert ügyünk van, ugyanis a LINQ lekérdezések nagyon hasonlóképp is megadhatók.
A LINQ a Visual Studio 2008-ban mutatkozott be először a C# és Visual Basic nyelvek részeként. A .NET Framework alapú gyűjtemények mellett még SQL adatbázis, ADO.NET Dataset és XML dokumentum is megcélozható a lekérdezéseivel.
Alapvető LINQ műveletek
Kiválasztás (select)
Nézzünk egy egyszerű lekérdezést, melyben kigyűjtjük ügyfeleinket:[ecko_code_highlight language=”c#”]var allCustomers = from cust in customers
select cust;[/ecko_code_highlight]
Az SQL szintaktikával ellentétben először a from kulcsszóval egy változót adunk meg. Ez lesz az az érték, ami a ciklusunk esetében az éppen aktív elemet jelölné az iteráció során. Ezt követi az in kulcsszó, ahol megadjuk magát a gyűjteményt melyben keresünk, majd pedig a select után adhatjuk meg, hogy az adott elemekből milyen típusú objektumot szeretnénk képezni. A mi esetünkben a teljes Customer típusú objektumokkal fogunk visszatérni.
Szűrés (where)
Mit érne egy lekérdezés, ha nem lehetne szűrni a találatok között. Szűrjük ki azokat az ügyfeleket, akiknek a székhelye Budapesten található:
[ecko_code_highlight language=”c#”]var customersInBudapest = from cust in customers
where cust.City == „Budapest”
select cust;[/ecko_code_highlight]
A where feltétel az SQL-hez hasonlóan tovább bővíthető és (&&), illetve a vagy (||) logikai operátorokkal.
Sorbarendezés (orderby)
A LINQ egyszerű rendezési lehetőségeket is kínál az adathalmazainkhoz, amit a megszokott orderby kulcsszóval bírhatunk működésre:
[ecko_code_highlight language=”c#”]var customersByCities = from cust in customers
orderby cust.City ascending
select cust;[/ecko_code_highlight]
Csoportosítás (group by)
A csoportosítás művelet lesz az első, ahol már új formában kapjuk vissza adatainkat. A csoportosítással kiválaszthatjuk az objektumok egy adattagját, mely alapján az adatokat egységekbe szeretnénk rendezni, például a székhely alapján:
[ecko_code_highlight language=”c#”]// Kimenet: IEnumerable<IGrouping<string, Customer>>
var customersByCities = from cust in customers
group cust by cust.City into custGroup
orderby custGroup.Key
select custGroup;[/ecko_code_highlight]
Összekapcsolás (join)
Az összekapcsoláshoz egy másik táblára szükségünk lesz, legyen ez most a városok listája, ahol szerepel a város neve, valamint az irányítószáma. Ezzel pedig akár már irányítószám alapján is tudjuk szűrni a találatokat:
[ecko_code_highlight language=”c#”]var customersInBudapest = from cust in customers
join city in cities on cust.City equals city.City
where city.ZipCode == 1134
select cust;[/ecko_code_highlight]
A továbbiakban
A LINQ SQL szerű lekérdezések mellett a gyűjteményeinken új függvényeket is meghatároz, melyekkel szintén rendkívül egyszerűen szűrhetünk az adatok között. A legközelebbi LINQ-ről szóló bejegyzésemben ezekkel fogunk foglalkozni!
-
Szia Gábor!
Van egy projektem amit MVVM alapján szeretnék megoldani és van bene SQL Server is. A témában kezdő vagyok de ambíciózus. 🙂
Az írásaid sokat segítettek, legalább már azt tudom, hogy mit nem tudok. Esetleg tudnál még bővebb leírást is adni az MVVM-et, ill. a LINQ-t illetően?
Segítséged előre is köszönöm.