Sposobu: Napisz zapytań LINQ w C#
W tym temacie przedstawiono trzy sposoby, w których można napisać LINQ kwerendy w języku C#:
Należy użyć składni kwerendy.
Należy użyć składni metody.
Użyć kombinacji składni kwerendy i składni metody.
W poniższych przykładach pokazano niektóre proste LINQ kwerend za pomocą każdego podejścia wymienionych wcześniej.Ogólnie rzecz biorąc reguła jest wykorzystanie (1), o ile to możliwe i wykorzystania (2) i (3) w każdym przypadku, gdy jest to konieczne.
[!UWAGA]
Te kwerendy działają na proste kolekcje w pamięci; jednak podstawowa składnia jest identyczna jak ta używana w LINQ to SQL i LINQ to XML.
Przykład
Składnia kwerendy
Zalecanym sposobem napisania większość kwerend jest użycie składni kwerendy do tworzenia wyrażenia w kwerendzie.W poniższym przykładzie przedstawiono trzy wyrażenia w kwerendzie.Pierwsze wyrażenie kwerendy demonstruje, jak filtrować lub ograniczyć wyniki poprzez zastosowanie warunków z where klauzuli.Zwraca wszystkie elementy w kolejności źródła, którego wartości są większe niż 7 lub mniej niż 3.Drugie wyrażenie demonstruje sposób uporządkowania wyników zwróconych.Trzecie wyrażenie demonstruje, jak grupa wyników zgodnie z kluczem.Ta kwerenda zwraca dwie grupy oparte na pierwszą literę wyrazu.
// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
from num in numbers
where num < 3 || num > 7
select num;
// Query #2.
IEnumerable<int> orderingQuery =
from num in numbers
where num < 3 || num > 7
orderby num ascending
select num;
// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
from item in groupingQuery
group item by item[0];
Należy zauważyć, że typ kwerendy jest IEnumerable<T>.Wszystkie te kwerendy można zapisać przy użyciu var jak pokazano w następującym przykładzie:
var query = from num in numbers...
W poprzednim przykładzie kwerendy nie faktycznie wykonuje aż iteracyjne zmienna kwerendy w foreach instrukcji.Aby uzyskać więcej informacji, zobacz Wprowadzenie do zapytań LINQ (C#).
Składnia metody
Niektóre operacje kwerendy musi być wyrażona jako wywołanie metody.Najbardziej powszechne takich metod są te, które zwraca singleton wartości liczbowe, takie jak Sum, Max, Min, Average, i tak dalej.Metody te muszą zawsze można wywołać ostatnio w dowolnej kwerendy, ponieważ reprezentuje pojedynczą wartość i nie może służyć jako źródło dla operacji dodatkowych kwerend.Poniższy przykład przedstawia wywołanie metody w wyrażeniu kwerendy:
List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
// Query #4.
double average = numbers1.Average();
// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);
Jeśli metoda ma parametry, są one dostarczane w formie lambda wyrażenie, jak pokazano w następującym przykładzie:
// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);
W poprzednich kwerend tylko kwerendy # 4 wykonuje natychmiast.To dlatego zwraca pojedynczą wartość i nie rodzajowego IEnumerable<T> kolekcji.Samą metodę ma używać foreach do obliczania jego wartości.
Każdy z poprzednich kwerend może być zapisany przy użyciu wpisując niejawne, z var., jak pokazano w następującym przykładzie:
// var is used for convenience in these queries
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);
Mieszane kwerendy i składni metody
W tym przykładzie przedstawiono na wynikach klauzula kwerendy należy użyć składni metody.Po prostu należy wpisać wyrażenie kwerendy w nawiasie, a następnie zastosować operator kropki i wywołania metody.W poniższym przykładzie kwerenda # 7 zwraca zliczania liczb, których wartość jest między 3 i 7.Ogólnie rzecz biorąc jednak lepiej jest używać zmiennej drugi do przechowywania wyników wywołania metody.W ten sposób kwerendy jest mniej prawdopodobne mylić z wyników kwerendy.
// Query #7.
// Using a query expression with method syntax
int numCount1 =
(from num in numbers1
where num < 3 || num > 7
select num).Count();
// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
from num in numbers1
where num < 3 || num > 7
select num;
int numCount2 = numbersQuery.Count();
Ponieważ kwerenda # 7 zwraca pojedynczą wartość i nie jest zbiorem, kwerenda jest wykonywana natychmiast.
Poprzedniej kwerendy mogą być zapisywane przy użyciu wpisując niejawne, z var, w następujący sposób:
var numCount = (from num in numbers...
To może być zapisany w składni metody w następujący sposób:
var numCount = numbers.Where(n => n < 3 || n > 7).Count();
Każde pozwolenie na wywóz może być zapisany przy użyciu wpisując jawnych, w następujący sposób:
int numCount = numbers.Where(n => n < 3 || n > 7).Count();
Zobacz też
Zadania
Instruktaż: Zapisywanie kwerendy w języku C# (LINQ)
Informacje
Koncepcje
Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)