LINQ

Z Wikipedii, wolnej encyklopedii

Language INtegrated Query (LINQ) – część technologii Microsoft .NET, której podstawy teoretyczne zostały opracowane przez Erika Meijera. Technologia LINQ umożliwia zadawanie pytań na obiektach. Składnia języka LINQ jest prosta i przypomina SQL.

Opis działania[edytuj | edytuj kod]

LINQ stanowi warstwę abstrakcji nad różnymi źródłami danych. Baza danych i jej elementy traktowane są również jak obiekty. Przestrzenie, które obsługuje LINQ, to:

  1. obiekty implementujące interfejs IEnumerable<T>
  2. bazy danych
  3. język XML

LINQ posiada pełne wsparcie dla transakcji, widoków oraz procedur składowanych. Zapytania stają się częścią języka .NET wspierającego .NET 3.5 (C#, Visual Basic, Delphi Prism itd.). Jeśli LINQ ma działać, musi znać mapę całej bazy danych. Zapytanie LINQ zwraca kolekcję z przestrzeni nazw typów ogólnych. Kolekcja ta może być modyfikowana, a następnie zwrócona do źródła. Dzięki temu zachowywana jest pełna kontrola typów danych i ich konwersji w poszczególnych mechanizmach pośredniczących w pobieraniu danych.

Standardowe operatory zapytań LINQ[edytuj | edytuj kod]

  • Select – operator ten jest używany, by wybrać z kolekcji odpowiedniego rodzaju dane (zbiory/podzbiory danego obiektu)
  • SelectMany – jest używany, by dokonać wyświetlenia w przypadku relacji jeden-do-wielu, czyli jeśli obiekt w kolekcji zawiera inną kolekcję jako część danych, SelectMany będzie użyte do wybrania całej pod-kolekcji.
  • Where – operator Where pozwala zdefiniować zbiór zasad dla każdego obiektu w kolekcji. Wszystkie te obiekty, które nie pasują do wybranej reguły, są odfiltrowywane.
  • Sum – używany do otrzymywania sumy
  • Min – używany do otrzymania minimalnej wartości
  • Max – używany do otrzymania maksymalnej wartości
  • Average – używany do otrzymania średniej
  • Aggregate – używany do stworzenia wyrażenia agregującego wszystkie elementy w kolekcji
  • Join – operator Join to operator bazujący na dwóch kolekcjach i tworzy z nich obiekt wynikowy.
  • GroupJoin – operator dla dokonania połączenia grupowego. Tak jak w przypadku operatora Select, wynik łączenia jest instancją nowej klasy z wszystkimi członkami obiektów źródłowych lub ich podzbiorem.
  • Take – operator Take jest używany do wybrania pierwszych n obiektów z kolekcji
  • TakeWhile
  • Skip
  • SkipWhile
  • OfType – operator używany do wybrania elementów konkretnego typu
  • Concat – operator tworzący konkatenacje dwóch kolekcji
  • OrderBy – sortuje wyniki po wybranym elemencie kolekcji – według określonego klucza
  • OrderByDescending – sortuje w odwrotnej kolejności niż standardowo
  • ThenBy – określa, po czym sortować w następnym etapie
  • ThenByDescending
  • Reverse – odwraca kolekcje
  • GroupBy
  • Distinct – usuwa duplikacje wartości kluczy w kolekcji
  • Union – operacja 'suma' – zwraca połączone ze sobą dwie kolekcje
  • Intersect – operacja 'iloczyn' – zwraca część wspólną dwóch kolekcji
  • Except
  • EqualAll – sprawdza, czy wszystkie elementy w kolekcji są takie same
  • First – zwraca pierwszy element kolekcji
  • FirstOrDefault – zwraca pierwszy element kolekcji lub NULL, gdy kolekcja jest pusta
  • Last – zwraca ostatni element kolekcji
  • LastOrDefault – zwraca ostatni element kolekcji lub NULL, gdy kolekcja jest pusta
  • Single
  • ElementAt – zwraca element o wybranym indeksie (index) z kolekcji
  • Any – sprawdza, czy którykolwiek element kolekcji spełnia warunek podany w nawiasach
  • All – sprawdza, czy wszystkie elementy kolekcji spełniają warunek podany w nawiasach
  • Contains – sprawdza, czy kolekcja zawiera element podany w argumencie
  • Count – zlicza elementy kolekcji

Przykład zapytania LINQ poza bazami danych[edytuj | edytuj kod]

Przykład wybrania w zapytaniu wszystkich obiektów z właściwością SomeProperty mniejszą niż 10

int someValue = 5; 
var results =  from c in someCollection
               let x = someValue * 2
               where c.SomeProperty < x
               select new {c.SomeProperty, c.OtherProperty};

foreach (var result in results)
{
        Console.WriteLine(result);
}

Ostatecznie kompilator wygeneruje klasę:

IEnumerable<SomeOtherClass> results =
     someCollection.Where
     (
          c => c.SomeProperty < (someValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     );
foreach (SomeOtherClass result in results)
{
     Console.WriteLine(result.ToString());
}

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]