Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Language-Integrated Lekérdezés (LINQ) olyan technológiák neve, amelyek a lekérdezési képességek közvetlenül a C#-nyelvbe való integrálásán alapulnak. Az adatok lekérdezései hagyományosan egyszerű sztringekként vannak kifejezve, típuselemzés és IntelliSense támogatás nélkül fordítási időben. Emellett különböző lekérdezési nyelvet kell elsajátítania minden adatforrástípushoz: SQL-adatbázisokhoz, XML-dokumentumokhoz, különböző webszolgáltatásokhoz stb. A LINQ használatával a lekérdezések az osztályokhoz, metódusokhoz és eseményekhez hasonlóan első osztályú nyelvi szerkezetek.
Lekérdezések írásakor a LINQ legláthatóbb nyelvi integrációjú része a lekérdezési kifejezés. Lekérdezési kifejezéseket deklaratív lekérdezési szintaxisba ír. Lekérdezési szintaxis használatával minimális kódolással hajthat végre szűrési, rendezési és csoportosítási műveleteket az adatforrásokon. Ugyanezekkel a lekérdezési kifejezési mintákkal kérdezheti le és alakíthatja át az adatokat bármilyen típusú adatforrásból.
Az alábbi példa egy teljes lekérdezési műveletet mutat be. A teljes művelet magában foglalja egy adatforrás létrehozását, a lekérdezési kifejezés meghatározását és a lekérdezés utasításban való foreach végrehajtását.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Előfordulhat, hogy az előző példa fordításához hozzá kell adnia egy using vagy using System.Linq; direktívát, hogy leforduljon. A .NET legújabb verziói implicit usingok alkalmazásával egészítik ki ezt az irányelvet globális usingként. Régebbi verziók esetén a forráshoz kell hozzáadnia.
Lekérdezési kifejezés áttekintése
- A lekérdezési kifejezések bármilyen LINQ-kompatibilis adatforrásból megvizsgálják és átalakítják az adatokat. Egyetlen lekérdezés például lekérhet adatokat egy SQL-adatbázisból, és kimenetként XML-adatfolyamot hozhat létre.
- A lekérdezési kifejezések számos ismerős C#-nyelvi szerkezetet használnak, amelyek megkönnyítik az olvasást.
- A lekérdezési kifejezés változói mind erősen be vannak állítva.
- A lekérdezések végrehajtása csak akkor történik meg, ha a lekérdezési változót iterálja, például egy
foreachutasításban. - Fordításkor a fordító a lekérdezési kifejezéseket szabványos lekérdezési operátori metódushívásokká alakítja a C# specifikációban meghatározott szabályok szerint. A lekérdezési szintaxist használó lekérdezéseket a metódusszintaxis használatával fejezheti ki. Bizonyos esetekben a lekérdezés szintaxisa olvashatóbb és tömörebb. Másokban a metódus szintaxisa olvashatóbb. A két különböző forma között nincs szemantikai vagy teljesítménybeli különbség. További információkért tekintse meg a C# nyelvspecifikációját és a Standard lekérdezési operátorok áttekintését.
- Egyes lekérdezési műveletek( például Count vagy Max) nem rendelkeznek egyenértékű lekérdezési kifejezési záradékkal, és metódushívásként kell kifejezésre juttatni. A metódusszintaxis és a lekérdezésszintaxis különböző módokon kombinálható.
- A lekérdezési kifejezések a lekérdezés típusától függően kifejezésfákra vagy delegátumokra alakíthatók. A fordító lekérdezéseket IEnumerable<T> fordít le a meghatalmazottaknak. A fordító IQueryable és IQueryable<T> lekérdezéseket kifejezésfákká fordítja. További információ: Kifejezésfák.
Az adatforrás LINQ-lekérdezésének engedélyezése
Memóriabeli adatok
A memóriában lévő adatok LINQ-lekérdezését kétféleképpen engedélyezheti. Ha az adat egy olyan típusú, amely implementálja IEnumerable<T>, akkor a LINQ to Objects használatával kérdezze le az adatokat. Ha nincs értelme az enumerálást az interfész implementálásával engedélyezni, definiálja a IEnumerable<T> LINQ standard lekérdezési operátori metódusokat ebben a típusban vagy bővítménytagként az adott típushoz. A standard lekérdezési operátorok egyéni implementációinak halasztott végrehajtást kell használniuk az eredmények visszaadásához.
Távoli adatok
A távoli adatforrás LINQ-lekérdezésének engedélyezéséhez a legjobb megoldás az IQueryable<T> interfész implementálása.
IQueryable LINQ-szolgáltatók
A implementálható IQueryable<T> LINQ-szolgáltatók összetettségükben nagy mértékben eltérhetnek.
Egy kevésbé összetett IQueryable szolgáltató egyetlen metódushoz férhet hozzá egy webszolgáltatásból. Ez a szolgáltatótípus az adatforrásra jellemző, mert konkrét információkat vár az általa kezelt lekérdezésekben. Zárt típusú rendszerrel rendelkezik, amely talán egyetlen eredménytípust is felfed. A lekérdezés végrehajtásának nagy része helyileg történik, például a Enumerable szabványos lekérdezési operátorok implementációinak használatával. Egy kevésbé összetett szolgáltató csak egy metódushívási kifejezést vizsgálhat meg a kifejezésfán, amely a lekérdezést jelöli, és lehetővé teszi a lekérdezés fennmaradó logikájának máshol történő kezelését.
Egy IQueryable közepes összetettségű szolgáltató olyan adatforrást célozhat meg, amely részben kifejező lekérdezési nyelvvel rendelkezik. Ha egy webszolgáltatást céloz meg, több webszolgáltatáshoz is hozzáférhet, és kiválaszthatja, hogy melyik metódust hívja meg a lekérdezés által kért információk alapján. A közepes összetettségű szolgáltató gazdagabb típusrendszerrel rendelkezik, mint egy egyszerű szolgáltató, de még mindig rögzített típusú rendszer. Előfordulhat például, hogy a szolgáltató olyan típusokat tesz közzé, amelyek egy-a-többhöz kapcsolatokkal rendelkeznek, amelyek bejárhatók, de nem biztosít leképezési technológiát a felhasználó által definiált típusok számára.
Egy összetett IQueryable szolgáltató, például az Entity Framework Core-szolgáltató teljes LINQ-lekérdezéseket fordíthat le kifejező lekérdezési nyelvre, például SQL-re. Az összetett szolgáltató általánosabb, mert a lekérdezésben szereplő kérdések szélesebb körét képes kezelni. Nyílt típusú rendszerrel is rendelkezik, ezért széles körű infrastruktúrát kell tartalmaznia a felhasználó által definiált típusok leképezéséhez. Egy összetett szolgáltató fejlesztése jelentős erőfeszítést igényel.