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.
A lekérdezések hatékony írásához tisztában kell lennie azzal, hogy egy teljes lekérdezési művelet változóinak típusai hogyan kapcsolódnak egymáshoz. Ha tisztában van ezekkel a kapcsolatokkal, könnyebben megértheti a LINQ-mintákat és a kódmintákat a dokumentációban. Emellett meg fogja érteni, hogy mi történik, ha a változók implicit módon vannak begépelve a használatával var.
A LINQ lekérdezési műveletek erősen be vannak állítva az adatforrásba, magában a lekérdezésbe és a lekérdezés végrehajtásába. A lekérdezés változóinak típusának kompatibilisnek kell lennie az adatforrás elemeinek típusával és az utasítás iterációs foreach változójának típusával. Ez az erős gépelés garantálja, hogy a típushibák a fordításkor jelennek meg, amikor azok kijavíthatók, mielőtt a felhasználók találkoznának velük.
Ezeknek a típuskapcsolatoknak a bemutatásához az alábbi példák többsége explicit gépelést használ az összes változóhoz. Az utolsó példa bemutatja, hogyan érvényesek ugyanazok az alapelvek akkor is, ha implicit gépelést használ a használatával var.
Olyan lekérdezések, amelyek nem alakítják át a forrásadatokat
Az alábbi ábrán egy LINQ to Objects lekérdezési művelet látható, amely nem végez átalakításokat az adatokon. A forrás sztringsorozatot tartalmaz, a lekérdezés kimenete pedig sztringek sorozata is.
- Az adatforrás típusargumentuma határozza meg a tartományváltozó típusát.
- A kiválasztott objektum típusa határozza meg a lekérdezési változó típusát. Itt
namevan egy karakterlánc. Ezért a lekérdezési változó egyIEnumerable<string>. - A lekérdezési változó át van iterálva a
foreachutasításban. Mivel a lekérdezési változó sztringek sorozata, az iterációs változó szintén sztring.
Lekérdezések, amelyek átalakítják a forrásadatokat
Az alábbi ábrán egy LINQ–SQL-lekérdezési művelet látható, amely egyszerű átalakítást hajt végre az adatokon. A lekérdezés bemenetként egy objektumsorozatot Customer vesz fel, és csak az Name eredmény tulajdonságát választja ki. Mivel Name egy sztringről van szó, a lekérdezés kimenetként sztringsorozatot hoz létre.
- Az adatforrás típusargumentuma határozza meg a tartományváltozó típusát.
- Az
selectutasítás a teljesNameobjektum helyett aCustomertulajdonságot adja vissza. Mivel aNameegy sztring, acustNameQuerytípus argumentumastring, nem pedigCustomer. - Mivel
custNameQuerysztringsorozatról van szó, aforeachhurok iterációs változójának is egynekstringkell lennie.
Az alábbi ábrán egy valamivel összetettebb átalakítás látható. Az select utasítás egy névtelen típust ad vissza, amely az eredeti Customer objektumnak csak két tagját rögzíti.
- Az adatforrás típusargumentuma mindig a lekérdezés tartományváltozójának típusa.
- Mivel az
selectutasítás névtelen típust állít elő, a lekérdezési változót implicit módon kell begépelni a használatávalvar. - Mivel a lekérdezési változó típusa implicit, a ciklus iterációs változójának
foreachimplicitnek is kell lennie.
A fordítónak engedni a típusinformációk következtetését
Bár ismernie kell a lekérdezési műveletek típuskapcsolatait, lehetősége van arra, hogy a fordító elvégezhesse az összes munkát. A kulcsszó var a lekérdezési művelet bármely helyi változója esetében használható. Az alábbi ábra hasonló a korábban tárgyalt 2. példához. A fordító azonban biztosítja az erős típust a lekérdezési művelet egyes változóihoz.
LINQ és általános típusok (C#)
A LINQ-lekérdezések általános típusokon alapulnak. A lekérdezések írásához nincs szükség az általános adatok részletes ismeretére. Érdemes azonban két alapfogalmat is megismernie:
- Amikor egy általános gyűjteményosztály egy példányát hozza létre, például List<T>a "T" helyére a lista által tartandó objektumtípust írja be. A karakterláncok listája például a következőképpen van megadva
List<string>, és az objektumok listájaCustomeraList<Customer>következőképpen van megadva. Az általános lista erősen gépelt, és számos előnnyel jár a gyűjteményekkel szemben, amelyek az elemeket Object tárolják. Ha megpróbál hozzáadni egyCustomeregyList<string>-hez, fordítási időben hibaüzenet jelenik meg. Az általános gyűjtemények használata egyszerű, mert nem kell futásidejű típuskonverziót végezni. -
IEnumerable<T> az a felület, amely lehetővé teszi az általános gyűjteményosztályok számbavételét az
foreachutasítás használatával. Az általános gyűjteményosztályok ugyanúgy támogatják a IEnumerable<T>-t, mint a nem általános gyűjteményosztályok a ArrayList-t támogatják, például a IEnumerable.
Az általános típusokkal kapcsolatos további információkért lásd: Generics.
IEnumerable<T> változók LINQ-lekérdezésekben
A LINQ lekérdezési változók a következőképpen vannak begépelve IEnumerable<T> , vagy származtatott típusként, például IQueryable<T>. Ha egy beírt IEnumerable<Customer>lekérdezési változót lát, az csak azt jelenti, hogy a lekérdezés végrehajtásakor nulla vagy több Customer objektum sorozata jön létre.
IEnumerable<Customer> customerQuery = from cust in customers
where cust.City == "London"
select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}
Az általános típusdeklarációk kezelésének engedése a fordítóra
Ha szeretné, a var kulcsszóval elkerülheti az általános szintaxist. A var kulcsszó arra utasítja a fordítót, hogy a záradékban megadott adatforrás alapján következtetsen a lekérdezési változó típusára from . Az alábbi példa ugyanazt a lefordított kódot állítja elő, mint az előző példában:
var customerQuery2 = from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}
A var kulcsszó akkor hasznos, ha a változó típusa nyilvánvaló, vagy ha nem olyan fontos explicit módon megadni a beágyazott általános típusokat, például a csoportos lekérdezések által előállítottakat. Általában azt javasoljuk, hogy ha használja var, ne feledje, hogy ez megnehezítheti a kód olvasását. További információ: Implicit módon beírt helyi változók.