Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Language-Integrated Query (LINQ) to nazwa zestawu technologii opartych na integracji funkcji zapytań bezpośrednio w języku C#. Tradycyjnie zapytania dotyczące danych są wyrażane jako proste ciągi bez sprawdzania typów w czasie kompilacji lub obsługi funkcji IntelliSense. Ponadto musisz poznać inny język zapytań dla każdego typu źródła danych: bazy danych SQL, dokumenty XML, różne usługi sieci Web itd. W przypadku LINQ zapytanie jest konstrukcją języka pierwszej klasy, podobnie jak klasy, metody i zdarzenia.
Podczas pisania zapytań najbardziej widocznym elementem "zintegrowanym ze językiem" linQ jest wyrażenie zapytania. Wyrażenia zapytań są zapisywane w składni zapytania deklaratywnego. Korzystając ze składni zapytań, wykonujesz operacje filtrowania, porządkowania i grupowania źródeł danych z minimalnym kodem. Te same wzorce wyrażeń zapytania służą do wykonywania zapytań i przekształcania danych z dowolnego typu źródła danych.
W poniższym przykładzie pokazano pełną operację zapytania. Kompletna operacja obejmuje tworzenie źródła danych, definiowanie wyrażenia zapytania i wykonywanie zapytania w instrukcji foreach
.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Aby poprzedni przykład został skompilowany, może być konieczne dodanie dyrektywy using
, using System.Linq;
. Najnowsze wersje .NET używają niejawnych dyrektyw using w celu dodania tej dyrektywy jako globalnej dyrektywy using. Starsze wersje wymagają dodania go do źródła.
Omówienie wyrażenia zapytania
- Wyrażenia zapytań pobierają i przekształcają dane z dowolnego źródła danych obsługującego LINQ. Na przykład pojedyncze zapytanie może pobierać dane z bazy danych SQL i generować strumień XML jako dane wyjściowe.
- Wyrażenia zapytań używają wielu znanych konstrukcji języka C#, co ułatwia ich odczytywanie.
- Zmienne w wyrażeniu zapytania są silnie typizowane.
- Zapytanie nie jest wykonywane, dopóki nie dokonasz iteracji zmiennej zapytania, na przykład w instrukcji
foreach
. - W czasie kompilacji wyrażenia zapytania są konwertowane na standardowe wywołania metod operatora zapytania zgodnie z regułami zdefiniowanymi w specyfikacji języka C#. Każde zapytanie, które można wyrazić przy użyciu składni zapytania, można również wyrazić przy użyciu składni metody. W niektórych przypadkach składnia zapytań jest bardziej czytelna i zwięzła. W innych, składnia metody jest bardziej czytelna. Nie ma semantyki ani różnicy wydajności między dwoma różnymi formami. Aby uzyskać więcej informacji, zobacz Specyfikacje języka C# i Standardowe operatory zapytań — omówienie.
- Niektóre operacje zapytań, takie jak Count lub Max, nie mają równoważnej klauzuli wyrażenia zapytania i dlatego muszą być wyrażone jako wywołanie metody. Składnia metody można łączyć ze składnią zapytań na różne sposoby.
- Wyrażenia zapytania można skompilować do drzew wyrażeń lub delegatów, w zależności od typu, do którego jest stosowane zapytanie. IEnumerable<T> zapytania są kompilowane do delegatów. IQueryable i IQueryable<T> zapytania są kompilowane w drzewa wyrażeń. Aby uzyskać więcej informacji, zobacz Drzewa wyrażeń.
Jak włączyć wykonywanie zapytań LINQ na swoim źródle danych
Dane w pamięci
Istnieją dwa sposoby włączania zapytań LINQ dotyczących danych w pamięci. Jeśli dane są typu implementującego IEnumerable<T>, przeprowadzasz zapytania dotyczące danych przy użyciu LINQ to Objects. Jeśli nie ma sensu włączyć wyliczania przez zaimplementowanie interfejsu IEnumerable<T> , należy zdefiniować standardowe metody operatorów zapytań LINQ w tym typie lub jako metody rozszerzenia dla tego typu. Niestandardowe implementacje standardowych operatorów zapytań powinny używać odroczonego wykonywania, aby zwrócić wyniki.
Dane zdalne
Najlepszą opcją umożliwiającą wykonywanie zapytań LINQ w zdalnym źródle danych jest zaimplementowanie interfejsu IQueryable<T> .
Dostawcy IQueryable LINQ
Dostawcy LINQ, którzy implementują IQueryable<T> , mogą się znacznie różnić w ich złożoności.
Mniej złożony IQueryable
dostawca może uzyskać dostęp do jednej metody z poziomu usługi sieci Web. Ten typ dostawcy jest bardzo specyficzny, ponieważ oczekuje określonych informacji w zapytaniach, które obsługuje. Ma zamknięty system typów, być może uwidaczniając pojedynczy typ wyniku. Większość wykonywania zapytania odbywa się lokalnie, na przykład przy użyciu Enumerable implementacji standardowych operatorów zapytań. Mniej złożony dostawca może zbadać tylko jedno wyrażenie wywołania metody w drzewie wyrażeń, które reprezentuje zapytanie, i pozwolić, aby pozostała logika zapytania została obsłużona w innym miejscu.
Dostawca IQueryable
średniej złożoności może mieć na celu źródło danych, które ma częściowo rozbudowany język zapytań. Jeśli jest ona przeznaczona dla usługi sieci Web, może uzyskać dostęp do więcej niż jednej metody usługi sieci Web i wybrać metodę do wywołania na podstawie informacji, których szuka zapytanie. Dostawca o średniej złożoności miałby bogatszy system typów niż prosty dostawca, ale nadal byłby to system stałego typu. Na przykład dostawca może udostępniać typy, które mają relacje jeden do wielu, które można nawigować, ale nie zapewnia technologii mapowania dla typów zdefiniowanych przez użytkownika.
IQueryable
Złożony dostawca, taki jak dostawca Platformy Entity Framework Core, może tłumaczyć kompletne zapytania LINQ na ekspresowy język zapytań, taki jak SQL. Bardziej ogólny jest złożony dostawca, ponieważ może obsłużyć szerszą gamę pytań w zapytaniu. Ma również system typu otwartego i dlatego musi zawierać rozbudowaną infrastrukturę do mapowania typów zdefiniowanych przez użytkownika. Przygotowanie złożonego dostawcy wymaga znacznego nakładu pracy.