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. A lekérdezési kifejezések deklaratív lekérdezési szintaxissal vannak megírva. 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 lekérdezik és átalakítják az adatokat. Egy 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
foreach
utasításban. - Fordításkor a lekérdezési kifejezések szabványos lekérdezési operátori metódushívásokká alakulnak a C# specifikációban meghatározott szabályok szerint. A lekérdezési szintaxissal kifejezhető lekérdezések a metódus szintaxisával is kifejezhetők. 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, ezért metódushívásként kell kifejezésre juttatni. A metódusszintaxis különböző módokon kombinálható a lekérdezési szintaxissal.
- 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. IEnumerable<T> a lekérdezések a meghatalmazottak számára vannak lefordítva. A(z) IQueryable és IQueryable<T> lekérdezések kifejezésfákká vannak összeállítva. 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ének kétféleképpen engedélyezhetők. Ha az adatok olyan típusúak, amelyek implementálják a IEnumerable<T>-t, akkor az adatok lekérdezésére a LINQ to Objects-öt használhatja. Ha nincs értelme az enumerálást az IEnumerable<T> interfész implementálásával engedélyezni, akkor a LINQ standard lekérdezési operátori metódusokat definiálhatja ebben a típusban vagy bővítménymetelyké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 nagyon specifikus, mert az általa kezelt lekérdezésekben konkrét információkat vár el. 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 lekérdezést jelképező kifejezésfában, és a lekérdezés fennmaradó logikáját máshol is kezelheti.
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ípusú rendszerrel rendelkezik, mint egy egyszerű szolgáltató, de továbbra is rögzített típusú rendszer lenne. Előfordulhat például, hogy a szolgáltató olyan típusokat hoz nyilvánosságra, amelyek egy-a-többhöz kapcsolatokkal rendelkeznek és bejárhatóak, de a felhasználó által definiált típusok számára nem biztosít leképezési technológiát.
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.