Megosztás a következőn keresztül:


A LINQ-t támogató C#-funkciók

Lekérdezési kifejezések

A lekérdezési kifejezések az SQL-hez vagy az XQueryhez hasonló deklaratív szintaxist használnak a gyűjtemények lekérdezéséhez System.Collections.Generic.IEnumerable<T> . Fordításkor a lekérdezés szintaxisa metódushívásokká alakul át a LINQ-szolgáltató szabványos lekérdezési metódusok implementációjára. Az alkalmazások a megfelelő névtér irányelvvel using történő megadásával szabályozzák a hatókörben lévő szabványos lekérdezési operátorokat. Az alábbi lekérdezési kifejezés sztringek tömböt vesz fel, a sztring első karaktere szerint csoportosítja őket, és a csoportokat rendeli.

var query = from str in stringArray
            group str by str[0] into stringGroup
            orderby stringGroup.Key
            select stringGroup;

Implicit módon beírt változók (var)

A var módosítóval arra utasíthatja a fordítót, hogy következtetsen és rendelje hozzá a típust, ahogy az itt látható:

var number = 5;
var name = "Virginia";
var query = from str in stringArray
            where str[0] == 'm'
            select str;

A deklarált var változók erősen be vannak adva, csakúgy, mint azok a változók, amelyek típusát explicit módon adja meg. A használata var lehetővé teszi névtelen típusok létrehozását, de csak helyi változók esetében. További információ: Implicit módon beírt helyi változók.

Objektum- és gyűjtemény-inicializálók

Az objektum- és gyűjtemény-inicializálók lehetővé teszik az objektumok inicializálását anélkül, hogy explicit módon konstruktort hívna meg az objektumhoz. Az inicializálókat általában lekérdezési kifejezésekben használják, amikor a forrásadatokat új adattípusba vetik. Ha egy nyilvános Name és Phone tulajdonságokkal rendelkező osztályt feltételezCustomer, az objektum inicializálója az alábbi kódhoz hasonlóan használható:

var cust = new Customer { Name = "Mike", Phone = "555-1212" };

Az osztályt Customer folytatva tegyük fel, hogy van egy adatforrás neve IncomingOrders, és hogy minden nagy OrderSizemegrendeléshez létre szeretne hozni egy új, a rendelésen alapuló újat Customer . Ezen az adatforráson linq-lekérdezés végrehajtható, és objektum inicializálással kitölthet egy gyűjteményt:

var newLargeOrderCustomers = from o in IncomingOrders
                            where o.OrderSize > 5
                            select new Customer { Name = o.Name, Phone = o.Phone };

Előfordulhat, hogy az adatforrás több tulajdonsággal rendelkezik, mint az Customer osztály, például OrderSizeaz objektum inicializálása esetén a lekérdezésből visszaadott adatok a kívánt adattípusba vannak formázva. Ön az osztály szempontjából releváns adatokat választja ki. Ennek eredményeképpen most már tele van System.Collections.Generic.IEnumerable<T> a kívánt újakkal Customer. Az előző példa a LINQ metódusszintaxisában is írható:

var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });

A C# 12-től kezdődően gyűjteménykifejezéssel inicializálhatja a gyűjteményeket.

További információk:

Névtelen típusok

A fordító névtelen típust hoz létre. A típusnév csak a fordító számára érhető el. A névtelen típusokkal kényelmesen csoportosíthat tulajdonságokat ideiglenesen egy lekérdezés eredményében anélkül, hogy külön elnevezett típust kellene definiálnia. A névtelen típusok inicializálása új kifejezéssel és objektum inicializálóval történt, ahogy az itt látható:

select new {name = cust.Name, phone = cust.Phone};

A C# 7-től kezdődően a csuplok használatával névtelen típusok hozhatók létre.

Bővítő metódusok

A bővítménymetódus olyan statikus metódus, amely egy típushoz társítható, így úgy hívható meg, mintha példánymetódus lenne a típuson. Ez a funkció lehetővé teszi, hogy gyakorlatilag anélkül "adjon hozzá" új metódusokat a meglévő típusokhoz, hogy ténylegesen módosítaná őket. A standard lekérdezési operátorok olyan bővítménymetelyek, amelyek linq lekérdezési funkciót biztosítanak minden implementált IEnumerable<T>típushoz.

Lambda-kifejezések

A lambda-kifejezések olyan beágyazott függvények , amelyek az operátor használatával választják el a => bemeneti paramétereket a függvény törzsétől, és fordításkor delegálttá vagy kifejezésfává alakíthatók. A LINQ-programozásban lambdakifejezésekkel találkozhat, amikor közvetlen metódushívásokat indít a standard lekérdezési operátorokhoz.

Kifejezések adatként

A lekérdezési objektumok összeállíthatók, ami azt jelenti, hogy egy lekérdezést egy metódusból adhat vissza. A lekérdezéseket ábrázoló objektumok nem az eredményként kapott gyűjteményt tárolják, hanem az eredmények szükség esetén történő előállításának lépéseit. A lekérdezési objektumok metódusokból való visszaadásának előnye, hogy azok további összeállításra vagy módosításra is használhatók. Ezért a lekérdezést visszaadó metódusok visszatérési értékének vagy out paraméterének is ilyen típusúnak kell lennie. Ha egy metódus konkrét List<T> vagy Array típusú lekérdezést hoz létre, a lekérdezés eredményeit adja vissza, nem magát a lekérdezést. A metódusból visszaadott lekérdezési változók továbbra is összeállíthatók vagy módosíthatók.

Az alábbi példában az első metódus QueryMethod1 visszaad egy lekérdezést visszatérési értékként, a második metódus QueryMethod2 pedig paraméterként out adja vissza a lekérdezést (returnQ a példában). Mindkét esetben ez egy visszaadott lekérdezés, nem pedig a lekérdezés eredménye.

IEnumerable<string> QueryMethod1(int[] ints) =>
    from i in ints
    where i > 4
    select i.ToString();

void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
    returnQ =
        from i in ints
        where i < 4
        select i.ToString();

int[] nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

var myQuery1 = QueryMethod1(nums);

A lekérdezés myQuery1 a következő foreach ciklusban lesz végrehajtva.

foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}

Húzza az egérmutatót a myQuery1 típus megtekintéséhez.

A közvetlenül, használat nélkül myQuery1visszaadott QueryMethod1 lekérdezést is végrehajthatja.

foreach (var s in QueryMethod1(nums))
{
    Console.WriteLine(s);
}

Vigye az egérmutatót a hívás fölé a visszatérési típus megtekintéséhez QueryMethod1 .

QueryMethod2 egy lekérdezést ad vissza a paraméter értékeként out :

QueryMethod2(nums, out IEnumerable<string> myQuery2);

// Execute the returned query.
foreach (var s in myQuery2)
{
    Console.WriteLine(s);
}

A lekérdezéseket a lekérdezésösszeállítással módosíthatja. Ebben az esetben a rendszer az előző lekérdezési objektumot használja egy új lekérdezési objektum létrehozásához. Ez az új objektum az eredeti lekérdezési objektumtól eltérő eredményeket ad vissza.

myQuery1 =
    from item in myQuery1
    orderby item descending
    select item;

// Execute the modified query.
Console.WriteLine("\nResults of executing modified myQuery1:");
foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}