Skip to content

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, Any
List<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 metodowej
var 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 warunek
int count = numbers.Count(n => n > 2);
// Sum - sumuje wszystkie elementy
int sum = numbers.Sum();
// Any - true, jeśli choć jeden element spełnia warunek
bool anyBig = numbers.Any(n => n > 7);
// materializacja wyniku do listy
// ToList - wykonuje zapytanie i zwraca wynik jako List
List<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.