Sdílet prostřednictvím


Základy výrazů dotazů (Průvodce programováním v C#)

Co je dotaz a co?

A dotazu je sada pokyny popisuje, jaká data načíst z daného datového zdroje (nebo zdrojů) a jaký tvar a organizace by měly mít vrácená data.Dotaz je odlišné od výsledků, které vytvoří.

Zdroj dat je obvykle logicky uspořádány jako posloupnost prvků stejného druhu.Tabulky databáze SQL obsahuje posloupnost řádků.Podobně ADO.NETDataTable obsahuje posloupnost DataRow objektů. V souboru XML je "posloupnosti" prvky XML (ačkoli tyto jsou organizovány hierarchicky ve stromové struktuře).Kolekce v paměti obsahuje posloupnost objektů.

Z hlediska aplikace určitý typ a struktura původní zdroj dat není důležité.Aplikace vždy vidí zdrojových dat, jako IEnumerable nebo IQueryable kolekce.V Technologie LINQ to XML, zdroj dat je zviditelnit jako IEnumerable<XElement>.In LINQ na DataSet, it is an IEnumerable<DataRow>.V Technologie LINQ to SQL, je IEnumerable nebo IQueryable vlastních objektů, ať jste definovali reprezentaci dat v tabulce SQL.

Dané posloupnosti tento zdroj dotazu může proveďte tři věci:

  • Načtení podmnožiny prvků vyrábět nové sekvence bez úpravy jednotlivých prvků.Dotaz může potom seřadit nebo seskupit vrácené sekvence různými způsoby, jak ukazuje následující příklad (předpokládá scores je int[]):

    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending 
        select score;
    
  • Načíst pořadí prvků, jako v předchozím příkladu, ale transformace je nový typ objektu.Dotaz může například načíst pouze příjmení z některých zákazníků záznamy ve zdroji dat.Nebo může získat úplný záznam a použít jej k vytvořit jiný typ objektu v paměti nebo dokonce dat XML před generováním sekvence konečný výsledek.Následující příklad ukazuje transformace z int se string.Poznámka: nový typ highScoresQuery.

    IEnumerable<string> highScoresQuery2 =
        from score in scores
        where score > 80
        orderby score descending 
        select String.Format("The score is {0}", score);
    
  • Načtěte hodnotu singleton zdrojová data, jako například:

    • Počet prvků, které splňují určité podmínky.

    • Prvek, který má nejvyšší nebo nejnižší hodnoty.

    • První prvek, který odpovídá podmínce nebo součet hodnot zejména v zadané sadě prvky.Například následující dotaz vrátí počet skóre větší než 80 z scores celočíselné pole:

    int highScoreCount =
        (from score in scores
         where score > 80
         select score)
         .Count();
    

    V předchozím příkladu poznámka závorky kolem výrazu dotazu před volání Count metoda.Také express to pomocí nové proměnné k ukládání konkrétních výsledků.Tato technika je čitelnější, protože proměnná, která dotaz uložit uchovává odděleně od dotazu, který ukládá výsledek.

    IEnumerable<int> highScoresQuery3 =
        from score in scores
        where score > 80
        select score;
    
    int scoreCount = highScoresQuery3.Count();
    

V předchozím příkladu je spuštěn dotaz ve volání Count, protože Count výsledky musí stanovit počet vrácených prvků iteraci highScoresQuery.

Co je výraz dotazu?

A výrazu dotazu je vyjádřeno v syntaxi dotazu.Výraz dotazu je prvotřídní jazyk konstrukce.Je stejně jako ostatní výraz a lze použít v libovolném kontextu, ve kterém je platný výraz jazyka C#.Výraz dotazu obsahuje sadu doložek v deklarativní syntaxi, která je podobná SQL nebo XQuery.Každé klauzule obsahuje jeden nebo více C# výrazy a tyto výrazy mohou samy výrazu dotazu nebo výrazu dotazu obsahovat.

Výraz dotazu musí začínat z klauzule a musí končit Vyberte nebo skupiny klauzule.Mezi první from klauzule a poslední select nebo group klauzule, může obsahovat jeden nebo více z těchto doložek volitelné: kde, Řadit podle, spojení, nechat a dokonce i další z klauzule.Můžete také použít do klíčové slovo v důsledku povolení join nebo group klauzule sloužit jako zdroj pro další klauzule ve stejném výrazu dotazu.

Proměnná dotazu

V LINQ, proměnná dotazu je libovolné proměnné, které jsou uloženy dotazu místo výsledky dotazu. Konkrétně proměnnou dotazu je vždy agregující typu, která bude vytvářet posloupnost prvků při musí ji je vstupní přes foreach prohlášení nebo přímé volání jeho IEnumerator.MoveNext metoda.

Následující příklad kódu zobrazí jednoduchý dotaz výraz s jedním datovým zdrojem, jedné klauzuli filtrování, jedné klauzuli objednávání a žádná transformace zdrojových elementů.select Konec klauzule dotazu.

static void Main()
{
    // Data source. 
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable 
        from score in scores //required 
        where score > 80 // optional 
        orderby score descending // optional 
        select score; //must end with select or group 

    // Execute the query to produce the results 
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 93 90 82 82      

V předchozím příkladu scoreQuery je dotazu proměnné , který se někdy označuje jako právě dotazu.Proměnná dotazu uložena žádná data skutečný výsledek se vyrábí v foreach smyčky.A když foreach příkaz provede, výsledky dotazu nejsou vráceny prostřednictvím proměnné dotazu scoreQuery.Místo toho jsou vráceny prostřednictvím iterační proměnná testScore.scoreQuery Proměnné lze musí druhá vstupní foreach smyčky.Stejné výsledky ohlásí tak dlouho, dokud ji ani zdroj dat byl změněn.

Proměnná dotazu může ukládat dotaz, který je vyjádřen v syntaxi dotazu nebo syntaxi metody nebo kombinace obou.V následujících příkladech i queryMajorCities a queryMajorCities2 jsou proměnných dotazu:

//Query syntax
IEnumerable<City> queryMajorCities =
    from city in cities
    where city.Population > 100000
    select city;


// Method-based syntax
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);

Následující dva příklady ukazují na druhé straně proměnných, které nejsou proměnných dotazu i pomocí jednotlivých je inicializována pomocí dotazu.Nejsou proměnných dotazu protože ukládají výsledky:

int highestScore =
    (from score in scores
     select score)
    .Max();

// or split the expression
IEnumerable<int> scoreQuery =
    from score in scores
    select score;

int highScore = scoreQuery.Max();

List<City> largeCitiesList =
    (from country in countries
     from city in country.Cities
     where city.Population > 10000
     select city)
       .ToList();

// or split the expression
IEnumerable<City> largeCitiesQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

List<City> largeCitiesList2 = largeCitiesQuery.ToList();

[!POZNÁMKA]

V LINQ dokumentaci proměnné, které ukládají dotazu v aplikaci word "dotaz" jako součást jejich názvy.Proměnné, které ukládají skutečný výsledek nemají "dotaz" v jejich názvech.

Další informace o různých způsobech express dotazů naleznete v Syntaxe využívající dotazy a syntaxe využívající metody v jazyce LINQ (C#).

Explicitní a implicitní zadáním proměnných dotazu

Tato dokumentace obsahuje explicitní typ proměnné dotazu obvykle Pokud chcete zobrazit typ vztahu mezi proměnnou dotazu a Vyberte klauzule.Však můžete použít také var klíčové slovo nacházela kompilátoru odvození typu Proměnná dotazu (nebo jiné místní proměnné) v době kompilace.Například dotaz příkladem, který byl dříve zobrazené v tomto tématu lze také vyjádřit pomocí implicitních zadáním:

// Use of var is optional here and in all queries. 
// queryCities is an IEnumerable<City> just as  
// when it is explicitly typed. 
var queryCities =
    from city in cities
    where city.Population > 100000
    select city;

Další informace naleznete v tématu Implicitně typované lokální proměnné (Průvodce programováním v C#) a Vztahy typů v operacích dotazu LINQ (C#).

Spuštění výrazu dotazu

Výraz dotazu musí začínat from klauzule.Určuje zdroj dat spolu s rozsahu proměnné.Rozsah proměnné představuje každý následující prvek v pořadí zdroje, jako je právě sekvence zdroj vyčerpán.Rozsah proměnné silný typ prvků ve zdroji dat na základě.V následujícím příkladu protože countries je pole Country objekty proměnné rozsah také zadali jako Country.Protože proměnné rozsah silný, můžete přístup k jakékoli dostupné členy typu operátor tečka.

IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km 
    select country;

Rozsah proměnné je v oboru, dokud dotaz je středníkem nebo s pokračování klauzule.

Výraz dotazu může obsahovat více from klauzule.Použití další from klauzule každý prvek v pořadí zdroje je kolekce nebo obsahuje kolekci.Předpokládejme například, že máte kolekci Country objekty, z nichž každý obsahuje kolekci City objekty s názvem Cities.Dotaz City objekty v každé Country, použijte dva from doložky, jak je znázorněno zde:

IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

Další informace naleznete v tématu from clause (Referenční dokumentace jazyka C#).

Koncové výraz dotazu

Výraz dotazu musí končit buď select klauzule nebo group klauzule.

Skupina klauzule

Použití group klauzule vyrábět pořadí skupin uspořádané podle klíče, který určíte.Klíč může být libovolný datový typ.Například následující dotaz vytvoří posloupnost skupiny obsahuje jeden nebo více Country objekty a jejíž klíč je char hodnotu.

var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

Další informace o seskupování najdete group – klauzule (Referenční dokumentace jazyka C#).

Vyberte klauzule

Použití select klauzule vyrábět všechny ostatní typy sekvence.Jednoduchý select klauzule právě vytváří posloupnost objektů stejného typu jako objekty, které jsou obsaženy ve zdroji dat.V tomto příkladu obsahuje zdroje dat Country objektů.orderby Klauzule právě Seřadí prvky do nové objednávky a select klauzule vytvoří posloupnost uspořádaný Country objektů.

IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

select Klauzule slouží k transformaci dat do sekvence nové typy.Tato transformace se nazývá také projekce.V následujícím příkladu select klauzule projekty sekvenci anonymních typů, která obsahuje pouze podmnožinu pole v původním prvku.Všimněte si, že nové objekty jsou inicializována pomocí objektu inicializátor.

// Here var is required because the query 
// produces an anonymous type. 
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

Další informace o všech způsobů, select klauzule slouží k transformaci dat naleznete v tématu select – klauzule (Referenční dokumentace jazyka C#).

Continuations s "do"

Můžete použít into klíčové slovo v select nebo group klauzule vytvořit dočasný identifikátor, který ukládá dotazu.To musí provádět operace dotazu další dotaz po seskupení nebo vybrat operaci.V následujícím příkladu countries jsou seskupeny podle obyvatelstva v oblasti 10 milionů.Poté, co tyto skupiny jsou vytvořené, další klauzulí filtru mimo některé skupiny a řazení skupin ve vzestupném pořadí.Provedení těchto operací další pokračování reprezentované countryGroup je vyžadován.

// percentileQuery is an IEnumerable<IGrouping<int, Country>> 
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10000000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country> 
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

Další informace naleznete v tématu into (Referenční dokumentace jazyka C#).

Filtrování, řazení a spojování

Mezi počáteční from klauzule a koncovky select nebo group klauzule, všechny klauzule (where, join, orderby, from, let) jsou volitelné.Některé volitelné doložky může být použita vícekrát nebo několikrát v textu dotazu.

Pokud klauzule

Použití where klauzule filtrovat prvky ze zdrojových dat na základě jednoho nebo více výrazů predikátu.where Klauzule v následujícím příkladu má dvě predikáty.

IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

Další informace naleznete v tématu where – klauzule (Referenční dokumentace jazyka C#).

Klauzule řadit podle

Použití orderby klauzule řadit výsledky vzestupně nebo sestupně.Můžete také určit pořadí řazení sekundární.Následující příklad provádí na primární řazení country objektů pomocí Area vlastnost.Potom provede sekundární řazení pomocí Population vlastnost.

IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area, country.Population descending 
    select country;

ascending Klíčové slovo je volitelné. Výchozí pořadí řazení je-li zadána žádná objednávka.Další informace naleznete v tématu orderby – klauzule (Referenční dokumentace jazyka C#).

Klauzule JOIN

Použití join klauzule spojit nebo kombinují prvky z jednoho datového zdroje s prvky z jiného zdroje dat na základě srovnání v zadaných klíčích v každý prvek k rovnosti.V LINQ, spojení operace jsou prováděny v posloupnosti, jehož prvky jsou různé typy objektů.Po připojili dvě sekvence, je nutné použít select nebo group určit, který prvek uložit pořadí výstupu příkazu.Anonymní typ můžete také zkombinovat nový typ posloupnosti výstup z každé sady prvků přidružené vlastnosti.V následujícím příkladu prod objekty, jejichž Category vlastnost odpovídá jedné z kategorií v categories pole řetězců.Výrobky jejichž Category neodpovídá řetězec v categories jsou odfiltrovány.select Prohlášení projekty nového typu, jehož vlastnosti jsou převzaty z obou cat a prod.

var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

Skupiny spojení lze provést také ukládání výsledků join do dočasné proměnné pomocí operace do klíčové slovo.Další informace naleznete v tématu join – klauzule (Referenční dokumentace jazyka C#).

Klauzule umožňují

Použití let klauzule uložit nové proměnné rozsah výsledek výrazu, jako je například volání metody.V následujícím příkladu rozsah proměnné firstName ukládá první prvek pole řetězců, které vrátil Split.

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(new char[] { ' ' })[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

Další informace naleznete v tématu let – klauzule (Referenční dokumentace jazyka C#).

Poddotazy ve výrazu dotazu

Klauzule dotazu může sám obsahovat výrazu dotazu je někdy označován jako poddotazu.Každý poddotazu začíná vlastní from klauzuli, která nutně neodkazuje na stejný zdroj dat v prvním from klauzule.Následující dotaz například zobrazí výrazu dotazu, který se používá v příkazu select získat výsledky operace seskupení.

var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

Další informace naleznete v tématu Postupy: Provádění poddotazů na skupinách (Průvodce programováním v C#).

Viz také

Koncepty

Průvodce programováním v C#

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

Přehled standardních operátorů dotazu

Další zdroje

LINQ (Language-Integrated Query)

Klíčová slova dotazu (Referenční dokumentace jazyka C#)