Zadanie 32
Czym są zapytania LINQ?
LINQ (Language Integrated Query) to mechanizm wbudowany w język (C#, VB.NET) pozwalający odpytywać różne źródła danych w jednolity sposób, bezpośrednio w kodzie. Zamiast osobnych języków zapytań dla różnych źródeł, używamy tej samej składni do kolekcji, baz danych, plików XML czy obiektów.
LINQ udostępnia dwie równoważne składnie (kompilator i tak tłumaczy zapytaniową na metodową):
- zapytaniowa - przypomina SQL, używa słów
from,where,select. - metodowa - płynna, łączy przez kropkę metody rozszerzające jak
Where,Select,OrderBy.
W zależności od źródła danych wyróżnia się odmiany:
- LINQ to Objects - kolekcje w pamięci.
- LINQ to SQL / LINQ to Entities - bazy danych.
- LINQ to XML - dokumenty XML.
using System.Linq;using System.Collections.Generic;
// najważniejsze operatory: where (filtr), select (wybór pól), orderby (sortowanie),// group by (grupowanie), join (łączenie kolekcji);// agregujące, zwracające jeden wynik: Count, Sum, Average, First, AnyList<int> numbers = new List<int> { 5, 2, 8, 1, 4 };
var query = from n in numbers // where - filtrowanie where n > 2 // orderby - sortowanie orderby n // select - rzutowanie/wybór pól select n;
// dokładnie ta sama operacja w składni metodowejvar fluent = numbers .Where(n => n > 2) .OrderBy(n => n) .Select(n => n);Ważną cechą LINQ jest leniwe wykonanie (deferred execution): zapytanie liczy się dopiero przy iteracji (foreach) lub wymuszeniu metodą jak ToList(), Count() czy First().
// operatory agregujące zwracają pojedynczą wartość (wymuszają wykonanie)// Count - liczy elementy spełniające warunekint count = numbers.Count(n => n > 2);// Sum - sumuje wszystkie elementyint sum = numbers.Sum();// Any - true, jeśli choć jeden element spełnia warunekbool anyBig = numbers.Any(n => n > 7);
// materializacja wyniku do listy// ToList - wykonuje zapytanie i zwraca wynik jako ListList<int> evens = numbers.Where(n => n % 2 == 0).ToList();Skrót do zapamiętania: LINQ to jednolity sposób odpytywania różnych źródeł danych (kolekcje, bazy, XML) wprost w C#. Dwie składnie: zapytaniowa (from/where/select) i metodowa (Where/Select), kompilator i tak zamienia jedną na drugą. Leniwe wykonanie (deferred execution). Odmiany: to Objects, to SQL/Entities, to XML.
- Jednolite zapytania do wielu źródeł danych w jednym języku.
- Składnia zapytaniowa (from…where…select) i metodowa (Where().Select()).
- Operatory: where, select, orderby, group by, join; agregujące: Count, Sum, Average, First, Any.
- Leniwe wykonanie - liczy się dopiero przy iteracji lub ToList()/Count().
- Odmiany: LINQ to Objects, to SQL/Entities, to XML.