LINQ
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:
- obiekty implementujące interfejs IEnumerable<T>
- bazy danych
- 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());
}