bhawk.hu – Magyar fejlesztői blog

bhawk.hu – Magyar fejlesztői blog


2019. július
h k s c p s v
« máj    
1234567
891011121314
15161718192021
22232425262728
293031  

Kategória


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:

var allCustomers = from cust in customers
        select cust;

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ó:

var customersInBudapest = from cust in customers
        where cust.City == „Budapest”
        select cust;

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:

var customersByCities = from cust in customers
        orderby cust.City ascending
        select cust;

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:

// Kimenet: IEnumerable<IGrouping<string, Customer>>
var customersByCities = from cust in customers
        group cust by cust.City into custGroup
        orderby custGroup.Key
        select custGroup;

Ö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:

var customersInBudapest = from cust in customers
        join city in cities on cust.City equals city.City
        where city.ZipCode == 1134
        select cust;

 

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


This site uses Akismet to reduce spam. Learn how your comment data is processed.