Sdílet prostřednictvím


Postupy: Zápis dotazů LINQ v jazyce C#

Toto téma uvádí tři způsoby, které můžete psát LINQ dotazu v jazyce C#:

  1. Syntaxe dotazu.

  2. Syntaxi metody.

  3. Použijte kombinaci syntaxe dotazu a syntaxi metody.

Následující příklady ukazují některé jednoduché LINQ dříve uvedeny dotazy pomocí jednotlivých přístupů.Obecné pravidlo je použití (1), kdykoli je to možné a (2) a (3), kdykoli je to nezbytné.

[!POZNÁMKA]

Tyto dotazy pracují kolekce jednoduché v paměti; Základní syntaxe je však stejná jako v Technologie LINQ to SQL a Technologie LINQ to XML.

Příklad

Syntaxe dotazu

Doporučený způsob zápisu většina dotazů je použití Syntaxe dotazu k vytvoření výrazy dotazu.Následující příklad ukazuje tři výrazy dotazu.První výraz dotazu ukazuje, jak filtrovat nebo omezit použitím podmínek s výsledky where klauzule.Vrátí všechny prvky v posloupnosti zdroj, jehož hodnoty jsou větší než 7 nebo menší než 3.Druhý výraz demonstruje vrácené výsledky.Třetí výraz ukazuje, jak seskupit výsledky podle klíče.Tento dotaz vrátí dvě skupiny založené na první písmeno slova.

// 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];

Všimněte si, že je typ dotazů IEnumerable.Všechny tyto dotazy nelze zapisovat pomocí var jak ukazuje následující příklad:

var query = from num in numbers...

Každý předchozího příkladu dotazy nespustit skutečně dokud iteraci proměnných dotazu foreach prohlášení.Další informace naleznete v tématu Úvod do dotazů LINQ (C#).

Syntaxi metody

Některé operace dotazu musí být vyjádřena jako volání metody.Nejběžnější jsou takové metody, které vrátí singleton číselné hodnoty, jako například Sum, Max, Min, Average, atd.Tyto metody musí vždy volat poslední v libovolný dotaz, protože představují pouze jednu hodnotu a nemůže sloužit jako zdroj pro operaci další dotaz.Následující příklad zobrazuje volání metody ve výrazu dotazu:

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);

Pokud metoda má parametry, tyto jsou poskytovány ve formě lambda výrazu, jak ukazuje následující příklad:

// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

V předchozích dotazů pouze Dotaz č. 4 provede okamžitě.Důvodem je, že vrátí jednu hodnotu a není obecný IEnumerable kolekce.Metoda sám má pro foreach k výpočtu jeho hodnoty.

Každý z předchozích dotazů lze zapsat pomocí implicitních psát s var, jak ukazuje následující příklad:

// var is used for convenience in these queries 
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);

Kombinovaný dotaz a syntaxi metody

Tento příklad ukazuje použití metody syntaxe na výsledky klauzule dotazu.Právě uzavřete do závorek, výrazu dotazu použít operátor tečka a volat metodu.Dotaz č. 7 v následujícím příkladu vrátí počet čísel, jehož hodnota je mezi 3 a 7.Obecně je však lepší používat k ukládání výsledků volání metody Druhá proměnná.Tímto způsobem je méně mohly být zaměněny s výsledky dotazu dotaz.

// 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();

Protože dotaz č. 7 vrátí jednu hodnotu a není kolekce, dotaz provede okamžitě.

Předchozí dotaz lze zapsat pomocí implicitních psát s var, takto:

var numCount = (from num in numbers...

Může být zapsán v syntaxi metody takto:

var numCount = numbers.Where(n => n < 3 || n > 7).Count();

Může být zapsán pomocí explicitních psaní, takto:

int numCount = numbers.Where(n => n < 3 || n > 7).Count();

Viz také

Úkoly

Návod: Zápis dotazů v C# (LINQ)

Referenční dokumentace

where – klauzule (Referenční dokumentace jazyka C#)

Koncepty

LINQ – výrazy dotazů (Průvodce programováním v C#)

Další zdroje

LINQ (Language-Integrated Query)