Udostępnij za pośrednictwem


Klasyfikacja standardowych operatorów zapytań według sposobu wykonywania (Visual Basic)

Implementacje LINQ to Objects standardowych metod operatorów zapytań są wykonywane na jeden z dwóch głównych sposobów: natychmiastowe lub odroczone. Operatory zapytań korzystające z wykonania odroczonego można dodatkowo podzielić na dwie kategorie: przesyłanie strumieniowe i nieprzesyłania strumieniowego. Jeśli wiesz, jak są wykonywane różne operatory zapytań, może to ułatwić zrozumienie wyników uzyskanych z danego zapytania. Jest to szczególnie istotne w przypadku zmiany źródła danych lub tworzenia zapytania na podstawie innego zapytania. W tym temacie klasyfikuje standardowe operatory zapytań zgodnie z ich sposobem wykonywania.

Sposób wykonywania

Natychmiastowe

Natychmiastowe wykonanie oznacza, że źródło danych jest odczytywane, a operacja jest wykonywana w punkcie kodu, w którym jest zadeklarowane zapytanie. Wszystkie standardowe operatory zapytań, które natychmiast zwracają pojedynczy, nieliczalny wynik.

Odłożone

Odroczone wykonanie oznacza, że operacja nie jest wykonywana w punkcie w kodzie, w którym zadeklarowano zapytanie. Operacja jest wykonywana tylko wtedy, gdy zmienna kwerendy jest wyliczana, na przykład przy użyciu For Each instrukcji . Oznacza to, że wyniki wykonywania zapytania zależą od zawartości źródła danych, gdy zapytanie jest wykonywane, a nie po zdefiniowaniu zapytania. Jeśli zmienna kwerendy jest wyliczana wiele razy, wyniki mogą się różnić za każdym razem. Prawie wszystkie standardowe operatory zapytań, których typ zwracany jest IEnumerable<T> lub IOrderedEnumerable<TElement> są wykonywane w sposób odroczony.

Operatory zapytań używające wykonywania odroczonego mogą być dodatkowo klasyfikowane jako przesyłanie strumieniowe lub nie przesyłane strumieniowo.

Przesyłanie strumieniowe

Operatory przesyłania strumieniowego nie muszą odczytywać wszystkich danych źródłowych przed uzyskaniem elementów. W momencie wykonywania operator przesyłania strumieniowego wykonuje operację na każdym elemecie źródłowym, ponieważ jest odczytywany i zwraca element, jeśli jest to odpowiednie. Operator przesyłania strumieniowego nadal odczytuje elementy źródłowe do momentu utworzenia elementu wyniku. Oznacza to, że w celu wygenerowania jednego elementu wyniku może zostać odczytany więcej niż jeden element źródłowy.

Przesyłanie strumieniowe bez przesyłania strumieniowego

Operatory nieprzesyłania strumieniowego muszą odczytywać wszystkie dane źródłowe, zanim będą mogły uzyskać element wyniku. Operacje, takie jak sortowanie lub grupowanie, należą do tej kategorii. W czasie wykonywania operatory zapytań spoza przesyłania strumieniowego odczytują wszystkie dane źródłowe, umieszczają je w strukturze danych, wykonują operację i dają wynikowe elementy.

Tabela klasyfikacji

Poniższa tabela klasyfikuje każdą standardową metodę operatora zapytania zgodnie z metodą wykonywania.

Uwaga

Jeśli operator jest oznaczony w dwóch kolumnach, dwie sekwencje wejściowe są zaangażowane w operację, a każda sekwencja jest oceniana inaczej. W takich przypadkach jest to zawsze pierwsza sekwencja na liście parametrów, która jest obliczana w sposób odroczony, przesyłany strumieniowo.

Standardowy operator zapytania Zwracany typ Natychmiastowe wykonanie Odroczone wykonywanie przesyłania strumieniowego Odroczone wykonywanie przesyłania strumieniowego
Aggregate Tsource X
All Boolean X
Any Boolean X
AsEnumerable IEnumerable<T> X
Average Pojedyncza wartość liczbowa X
Cast IEnumerable<T> X
Concat IEnumerable<T> X
Contains Boolean X
Count Int32 X
DefaultIfEmpty IEnumerable<T> X
Distinct IEnumerable<T> X
ElementAt Tsource X
ElementAtOrDefault Tsource X
Empty IEnumerable<T> X
Except IEnumerable<T> X X
First Tsource X
FirstOrDefault Tsource X
GroupBy IEnumerable<T> X
GroupJoin IEnumerable<T> X X
Intersect IEnumerable<T> X X
Join IEnumerable<T> X X
Last Tsource X
LastOrDefault Tsource X
LongCount Int64 X
Max Pojedyncza wartość liczbowa, TSource lub TResult X
Min Pojedyncza wartość liczbowa, TSource lub TResult X
OfType IEnumerable<T> X
OrderBy IOrderedEnumerable<TElement> X
OrderByDescending IOrderedEnumerable<TElement> X
Range IEnumerable<T> X
Repeat IEnumerable<T> X
Reverse IEnumerable<T> X
Select IEnumerable<T> X
SelectMany IEnumerable<T> X
SequenceEqual Boolean X
Single Tsource X
SingleOrDefault Tsource X
Skip IEnumerable<T> X
SkipWhile IEnumerable<T> X
Sum Pojedyncza wartość liczbowa X
Take IEnumerable<T> X
TakeWhile IEnumerable<T> X
ThenBy IOrderedEnumerable<TElement> X
ThenByDescending IOrderedEnumerable<TElement> X
ToArray Tablica TSource X
ToDictionary Dictionary<TKey,TValue> X
ToList IList<T> X
ToLookup ILookup<TKey,TElement> X
Union IEnumerable<T> X
Where IEnumerable<T> X

Zobacz też