..

LINQ (Language Integrated Query)

V C# je LINQ pouze syntaxe, nedefinuje zadnou semantiku.

var collection : IEnumerable<int>;

// do klauzule pisu pouze telo lambda funkce
var data = from x in collection where x < 5 orderby x select x*2;
// prelozi se to na tohle
data == collection.Where(x => x<5).Orderby(x => x).Select(x => x*2);

To prvni se prelozi na to druhe. Standardne ty metody Where, Select, Orderby atd implementuje modul LinqToObjects. Ale muzu si napsat vlastni implementaci - jsou to proste extension metody IEnumerable, potom dam using a bude se pouzivat to moje.

Pokud se to spodni prelozi, tak to horni je syntakticky spravne. Dotaz musi zacinat from, musi tam byt in a musi koncit select. Select funguje stejne jako ostatni klauzule, az na pripad, kdy vracim proste x, pak se ten posledni Select(x => x) vynecha.

Navrat LINQ vyrazu urcuje posledni klauzule, muze to byt cokoliv, takze se pouziva duck typing.

To x nemusi byt collection, ale uplne cokoliv. Na tom typu jen musi existovat public metody odpovidajici tem klauzulim, co pouzivam.

To LinqToObjects implementuje extension metody pro IEnumerable ve staticke tride Enumerable.

Pokud budu mit nejaky vlastni typ, ktery implementuje IEnumerable a definuju si na nem vlastni metodu Where, tak se misto te LINQ metody pouzije ta moje.

Jak funguje LinqToObjects