Udostępnij za pośrednictwem


Sposobu: Napisz zapytań LINQ w C#

W tym temacie przedstawiono trzy sposoby, w których można napisać LINQ kwerendy w języku C#:

  1. Należy użyć składni kwerendy.

  2. Należy użyć składni metody.

  3. 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

gdy klauzula (C# odniesienia)

Koncepcje

Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)

Inne zasoby

LINQ (zintegrowane języka kwerend)