Komentáře k článku

LINQ a lambda expressions

Článek představuje technologii LINQ, která umožňuje unifikované dotazování do datových zdrojů z prostředí .NET. LINQ přišel s verzí .NET Frameworku 3.5 a jazyky C# 3.0 a Visual Basic 9. Protože je LINQ velmi úzce svázán s novinkami v těchto verzích programovacích jazyků, podíváme se také na jednu z nejzásadnější a zároveň netriviálních novinek – lambda expressions.

Zpět na článek

7 komentářů k článku LINQ a lambda expressions:

  1. Tuck

    Vlastní implementace IQueryable<T>

    Moc pěkně napsáno. Ještě by byl super článek o vlastní implementaci IQueryable<T>.

    Díky za článek

  2. René Stein

    Drobná upřesnění

    Pěkný článek Augi.

    Jen bych zmínil dvě maličkosti:

    Citace:
    „V prvních verzích C# byla jediná možnost – vytvořit metodu se stejnou signaturou a do delegáta přiřadit její jméno:“

    To je pravda, ale automatická inference typu delegáta nefungovala. V C# 1.x bylo nutné použít takovouto syntaxi.

    ExampleDelegate del = new ExampleDelega­te(ExampleMet­hod);

    Chápu, že klíčové slovo var jsi nechtěl použít a u kolekcí žádná záludnost nehrozí, ale té explicitní deklarace typu proměnných bych se v tomto případě bál.

    Už jen proto, že jsme několikrát viděl v praxi u lidí, kteří se zaklínali tím, že var je zlo, tento děsivý kód.

    IEnumerable<Person> men = persons.Where(p ⇒ p.Gender == Gender.Male);

    Ale persons byly typu IQueryable (from person in dbContext.Persons select person). Potom to znamena, ze dotazem do databaze byly vyzvednuty vsechny osoby a teprve v aplikace se aplikoval operator where z IEnumerable. IQueryable je v tomto pripade BOHUZEL potomkem IEnumerable, takze implicitni konverze bez problemu projde.

    Pokud pouziju:
    var men = persons.Where(p ⇒ p.Gender == Gender.Male);
    Nechavam spinavou praci na kompilatoru, ktery v danem pripade spravne vytvori promennou typu IQueryable a cely dotaz i s podminkou bude vykonan na serveru (SQL) a vrati se mi jen zaznamy, ktere vyhovuji podmince p.Gender == Gender.Male);

    1. René Stein

      Re: Drobná upřesnění

      IEnumerable<Person> men = persons.Where(p ⇒ p.Gender == Gender.Male);
      Tadz ještě upřesním, že person byly původně IQuryable, ale jsou také přetypovány na IEnumerable.

      IEnumerable<Person> men = from person in dbContext.Persons select person;

    2. Michal AugustýnAutor příspěvku

      Re: Drobná upřesnění

      Díky, velmi dobré poznámky!

      O tom druhém (IEnumerable vs. IQueryable) jsem ani nikdy nepřemýšlel, protože téměž vždy používám var.
      Jen bych dodal, že jádrem problému je to, že použitá extension metoda Where se vybere už při kompilaci a to podle uvedeného typu.
      Aspoň mám o argument víc, proč používat var :)

    3. Michal B.

      Re: Drobná upřesnění

      Ahoj Rene.
      Zajimave upozorneni, ktere neni vubec „viditelne“ na prvni pohled.
      Diky za nej !

      Michal

  3. Petr Minařík

    Díky
    Díky rád jsme si přečetl článeček. Pomohlo mně začátečníkovi a to tak, že vydatně při pochopení delegátů, lambda i linq.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=3107