bhawk.hu – Magyar fejlesztői blog

bhawk.hu – Magyar fejlesztői blog


2024. november
h K s c p s v
« dec    
 123
45678910
11121314151617
18192021222324
252627282930  

Kategóriák


LINQ: SQL szerű keresés gyűjteményekben

Gulyás GáborGulyás Gábor

Szá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!

Minden ami Microsoft technológia! Több mint 8 éve foglalkozom programozással, ez idő alatt pedig rengeteg nyelvet elsajátítottam, leginkább a C#-ot kedvelem! Jelenleg szoftverfejlesztőként dolgozom!

Comments 2
  • Babar
    Posted on

    Babar Babar

    Válasz Author

    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.


    • Gulyás Gábor
      Posted on

      Gulyás Gábor Gulyás Gábor

      Válasz Author

      Szia Babar!
      Örülök, hogy hasznát vetted írásaimnak 🙂 MVVM-re javaslom, hogy alapozásként olvasd át a blogomon található néhány cikket, ezek nagy vonalakban végigvezetnek ezen a mintán. Amennyiben ennél mélyebb szintre szeretnél jutni az MVVM-et illetően, javaslom hogy látogass el az MVVM Light dokumentációs oldalára, amit itt találsz meg: http://www.mvvmlight.net/doc/

      LINQ-hoz rengeteg példát találhatsz a következő MSDN-es kódban: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

      Sajnos ezek mind angol nyelvű anyagok, igyekszem a jövőben én is még mélyebb szintű tudást átadni magyar nyelven itt a blogomban, sajnos az utóbbi időben kevesebb időm volt a blogolásra mint szerettem volna 🙂

      Ha bármiben tudok még segíteni, kérdezz nyugodtan, a projektedhez pedig sok sikert kívánok!

      Gábor


Ez a weboldal az Akismet szolgáltatását használja a spam kiszűrésére. Tudjunk meg többet arról, hogyan dolgozzák fel a hozzászólásunk adatait..