Sdílet prostřednictvím


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

Tento návod ukazuje funkce jazyka C#, které se používají při zápisu LINQ dotazových výrazů.Po dokončení tohoto návodu budete připraveni přejít na vzorky a dokumentaci pro konkrétní LINQ zprostředkovatele, které vás zajímají, jako například Technologie LINQ to SQL, LINQ objektů DataSet, nebo Technologie LINQ to XML.

Požadavky

Tento návod vyžaduje funkce, které jsou zavedeny v aplikaci Visual Studio 2008.

odkaz na video Grafickou verzi tohoto tématu, viz Video postupy: písemné dotazy v jazyce C# (LINQ).

Vytvoření projektu jazyka C#

Vytvoření projektu

  1. Spusťte aplikaci Visual Studio.

  2. V panelu nabídek zvolte Soubor, Nový, Projekt.

    Otevře se dialogové okno Nový projekt.

  3. Rozbalte Instalované, rozbalte položku šablony, rozbalte položku **Visual C#**a pak zvolte Konzolové aplikace.

  4. V jméno textové pole, zadejte jiný název nebo přijměte výchozí název a pak zvolte OK tlačítko.

    V podokně Řešení - průzkumník se zobrazí nový projekt.

  5. Všimněte si, že váš projekt obsahuje odkaz na System.Core.dll a using směrnice pro System.Linq oboru názvů.

Vytvoření v paměti zdroje dat.

Zdroj dat pro dotazy je jednoduchý seznam Student objekty.Každý Student záznam obsahuje jméno, příjmení a pole obsahující celá čísla, který představuje jejich testované hodnoty ve třídě.Zkopírujte tento kód do projektu.Poznámka: následující charakteristiky:

  • Student Třída se skládá z automaticky implementované vlastnosti.

  • Každý student v seznamu je inicializován inicializátor objektu.

  • Samotný seznam je inicializován inicializátory kolekce.

Tato celá datová struktura bude inicializován a instance bez explicitní volání konstruktoru nebo explicitní členský přístup.Další informace o těchto nových funkcích naleznete v tématu Automaticky implementované vlastnosti (Průvodce programováním v C#) a Inicializátory objektu a kolekce (Průvodce programováním v C#).

Chcete-li přidat zdroj dat

  • Přidat Student třídy a inicializována seznam studentů na Program tříd v projektu.

    public class Student
    {
        public string First { get; set; }
        public string Last { get; set; }
        public int ID { get; set; }
        public List<int> Scores;
    }
    
    // Create a data source by using a collection initializer. 
    static List<Student> students = new List<Student>
    {
       new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
       new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
       new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94, 65, 91}},
       new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
       new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91, 70}},
       new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90, 94}},
       new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80, 87}},
       new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
       new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88, 92}},
       new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
       new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85, 91, 60}},
       new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91, 91} }
    };
    

Chcete-li přidat nový Student seznam studentů

  • Přidat nový Student na Students seznam a pomocí názvu a otestovat skóre podle vašeho výběru.Zkuste zadat všechny nové informace student za účelem lepší učit syntaxi pro inicializátor objektu.

Vytvoření dotazu

Chcete-li vytvořit jednoduchý dotaz

  • V aplikace Main metoda, vytvořit jednoduchý dotaz, který při spuštění, vytvoří seznam všech studentů, jejichž skóre prvního testu bylo vyšší než 90.Všimněte si, že celé Student je vybrán objekt, typ dotazu je IEnumerable<Student>.Přestože kód může také použít implicitní psát pomocí var klíčové slovo, explicitní zadáním lze jasně ukazují výsledky.(Další informace o var, viz Implicitně typované lokální proměnné (Průvodce programováním v C#).)

    Všimněte si také, že dotazu proměnné rozsahu student, slouží jako odkaz na každé Student ve zdroji, členský přístup pro každý objekt.

// Create the query. 
// The first line could also be written as "var studentQuery ="
IEnumerable<Student> studentQuery =
    from student in students
    where student.Scores[0] > 90
    select student;

Spuštění dotazu

Chcete-li spustit dotaz

  1. Nyní psát foreach smyčky, která způsobí, že dotaz spustit.Pamatujte si následující kód:

    • Každý element vráceného postupně otevírá iterační proměnná v foreach smyčky.

    • Typ této proměnné je Student, a typ proměnné dotazu je kompatibilní, IEnumerable<Student>.

  2. Po přidání tohoto kódu, sestavení a spuštění aplikace stisknutím kombinace kláves Ctrl + F5, chcete-li zobrazit výsledky v konzoly okna.

// Execute the query. 
// var could be used here also. 
foreach (Student student in studentQuery)
{
    Console.WriteLine("{0}, {1}", student.Last, student.First);
}

// Output: 
// Omelchenko, Svetlana 
// Garcia, Cesar 
// Fakhouri, Fadi 
// Feng, Hanying 
// Garcia, Hugo 
// Adams, Terry 
// Zabokritski, Eugene 
// Tucker, Michael

Chcete-li přidat další podmínku

  • Můžete kombinovat více logických podmínek v where klauzule, chcete-li další upřesnění dotazu.Následující kód přidá podmínku tak, že dotaz vrátí ty studenty, jejichž první skóre byl více než 90 a jejichž poslední skóre méně než 80.where Klauzule by měl vypadat podobně jako následující kód.

    where student.Scores[0] > 90 && student.Scores[3] < 80
    

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

Upravte dotaz

Řazení výsledků

  1. To bude snazší kontrolovat výsledky, pokud jsou v nějakém pořadí.Můžete si objednat vrácené sekvence podle libovolného pole přístupné ve zdrojových prvků.Například následující orderby klauzule objednávky výsledky v abecedním pořadí od A do Ž podle poslední název každý student.Přidejte následující orderby klauzule dotazu, hned po where prohlášení a před select prohlášení:

    orderby student.Last ascending
    
  2. Nyní změnit orderby klauzuli tak, že se výsledky v obráceném pořadí objednávek podle skóre na první test z nejvyšší skóre skóre.

    orderby student.Scores[0] descending
    
  3. Změna WriteLine formátovací řetězec tak, aby se zobrazí skóre:

    Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);
    

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

Chcete-li seskupit výsledky

  1. Seskupení je výkonné funkce ve výrazech dotazu.Dotaz s klauzulí skupiny vytvoří posloupnost skupiny a obsahuje vlastní skupinu Key a posloupnost, která se skládá ze všech členů této skupiny.Následující nový dotaz studenty skupiny pomocí prvního písmene příjmení jako klíč.

    // studentQuery2 is an IEnumerable<IGrouping<char, Student>> 
    var studentQuery2 =
        from student in students
        group student by student.Last[0];
    
  2. Všimněte si, že typ dotazu se změnilo.Nyní vyrábí řada skupin, které mají char typu jako klíč a sekvenci Student objekty.Protože byl změněn typ dotazu, následující kód změny foreach spuštění smyčky také:

    // studentGroup is a IGrouping<char, Student> 
    foreach (var studentGroup in studentQuery2)
    {
        Console.WriteLine(studentGroup.Key);
        foreach (Student student in studentGroup)
        {
            Console.WriteLine("   {0}, {1}",
                      student.Last, student.First);
        }
    }
    
    // Output: 
    // O 
    //   Omelchenko, Svetlana 
    //   O'Donnell, Claire 
    // M 
    //   Mortensen, Sven 
    // G 
    //   Garcia, Cesar 
    //   Garcia, Debra 
    //   Garcia, Hugo 
    // F 
    //   Fakhouri, Fadi 
    //   Feng, Hanying 
    // T 
    //   Tucker, Lance 
    //   Tucker, Michael 
    // A 
    //   Adams, Terry 
    // Z 
    //   Zabokritski, Eugene
    
  3. Stisknutím kláves Ctrl + F5 spusťte aplikaci a zobrazit výsledky v konzoly okna.

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

Vytvoření proměnné implicitně zadali.

  • Explicitně kódování IEnumerables z IGroupings rychle stát únavné.Můžete napsat stejný dotaz a foreach smyčka mnohem snadněji pomocí var.var Klíčové slovo nedojde ke změně typů objektů; právě pokyn kompilátoru k odvození typů.Změnit typ studentQuery a iterační proměnná group na var a spusťte dotaz znovu.Všimněte si, že se ve vnitřní foreach smyčky, iterační proměnná je stále zadán jako Student, a dotaz funguje stejně jako dříve.Změna s iterační proměnná k var a spusťte dotaz znovu.Vidíte, že dostanete přesně stejné výsledky.

    var studentQuery3 =
        from student in students
        group student by student.Last[0];
    
    foreach (var groupOfStudents in studentQuery3)
    {
        Console.WriteLine(groupOfStudents.Key);
        foreach (var student in groupOfStudents)
        {
            Console.WriteLine("   {0}, {1}",
                student.Last, student.First);
        }
    }
    
    // Output: 
    // O 
    //   Omelchenko, Svetlana 
    //   O'Donnell, Claire 
    // M 
    //   Mortensen, Sven 
    // G 
    //   Garcia, Cesar 
    //   Garcia, Debra 
    //   Garcia, Hugo 
    // F 
    //   Fakhouri, Fadi 
    //   Feng, Hanying 
    // T 
    //   Tucker, Lance 
    //   Tucker, Michael 
    // A 
    //   Adams, Terry 
    // Z 
    //   Zabokritski, Eugene
    

    Další informace o var., viz Implicitně typované lokální proměnné (Průvodce programováním v C#).

Chcete-li objednat skupin podle jejich hodnoty klíče

  • Při spuštění předchozího dotazu zjistíte, že skupiny nejsou uvedeny v abecedním pořadí.Chcete-li toto nastavení změnit, je nutné zadat orderby klauzule za group klauzule.Ale pro použití orderby klauzule, je nutné nejprve identifikátor, který slouží jako odkaz na skupiny vytvořené group klauzule.Zadejte identifikátor pomocí into klíčové slovo, a to následujícím způsobem:

    var studentQuery4 =
        from student in students
        group student by student.Last[0] into studentGroup
        orderby studentGroup.Key
        select studentGroup;
    
    foreach (var groupOfStudents in studentQuery4)
    {
        Console.WriteLine(groupOfStudents.Key);
        foreach (var student in groupOfStudents)
        {
            Console.WriteLine("   {0}, {1}",
                student.Last, student.First);
        }
    }
    
    // Output: 
    //A 
    //   Adams, Terry 
    //F 
    //   Fakhouri, Fadi 
    //   Feng, Hanying 
    //G 
    //   Garcia, Cesar 
    //   Garcia, Debra 
    //   Garcia, Hugo 
    //M 
    //   Mortensen, Sven 
    //O 
    //   Omelchenko, Svetlana 
    //   O'Donnell, Claire 
    //T 
    //   Tucker, Lance 
    //   Tucker, Michael 
    //Z 
    //   Zabokritski, Eugene
    

    Při spuštění tohoto dotazu, zobrazí se že skupiny jsou nyní seřazeny v abecedním pořadí.

Chcete-li zavést identifikátor, pomocí kterých

  • Můžete použít let klíčové slovo zavést identifikátor pro některý z výsledků výrazu ve výrazu dotazu.Tento identifikátor může být v zájmu usnadnění, jako v následujícím příkladu, nebo jej můžete zvýšit výkon ukládáním výsledků výrazu tak, aby se nemá počítat vícekrát.

    // studentQuery5 is an IEnumerable<string> 
    // This query returns those students whose 
    // first test score was higher than their 
    // average score. 
    var studentQuery5 =
        from student in students
        let totalScore = student.Scores[0] + student.Scores[1] +
            student.Scores[2] + student.Scores[3]
        where totalScore / 4 < student.Scores[0]
        select student.Last + " " + student.First;
    
    foreach (string s in studentQuery5)
    {
        Console.WriteLine(s);
    }
    
    // Output: 
    // Omelchenko Svetlana 
    // O'Donnell Claire 
    // Mortensen Sven 
    // Garcia Cesar 
    // Fakhouri Fadi 
    // Feng Hanying 
    // Garcia Hugo 
    // Adams Terry 
    // Zabokritski Eugene 
    // Tucker Michael
    

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

Chcete-li použít metodu syntaxe ve výrazu dotazu

  • Jak je popsáno v Syntaxe využívající dotazy a syntaxe využívající metody v jazyce LINQ (C#), některé operace dotazu lze vyjádřit pouze pomocí syntaxe metoda.Následující kód vypočítá celkové skóre pro každý Student v zdrojové sekvenci dat a poté zavolá Average() metoda na výsledky tohoto dotazu k výpočtu průměrné skóre třídy.Poznamenejte si umístění závorky kolem výrazu dotazu.

    var studentQuery6 =
        from student in students
        let totalScore = student.Scores[0] + student.Scores[1] +
            student.Scores[2] + student.Scores[3]
        select totalScore;
    
    double averageScore = studentQuery6.Average();
    Console.WriteLine("Class average score = {0}", averageScore);
    
    // Output: 
    // Class average score = 334.166666666667
    

Chcete-li transformovat nebo projekt v klauzuli select

  1. Je velmi běžné, že dotaz k výrobě sekvence, jejichž prvky se liší od prvků ve zdrojové sekvence.Odstranit nebo poznámky, předchozí dotaz a provádění smyčky a nahraďte následující kód.Všimněte si, že dotaz vrátí posloupnosti řetězců (ne Students), a tato skutečnost se odráží v foreach smyčky.

    IEnumerable<string> studentQuery7 =
        from student in students
        where student.Last == "Garcia" 
        select student.First;
    
    Console.WriteLine("The Garcias in the class are:");
    foreach (string s in studentQuery7)
    {
        Console.WriteLine(s);
    }
    
    // Output: 
    // The Garcias in the class are: 
    // Cesar 
    // Debra 
    // Hugo
    
  2. Kód dříve v tomto návodu uvedeno, že průměrná třída skóre je přibližně 334.K vytvoření sekvence Students jejichž celkové skóre je větší než průměr třídy, spolu s jejich Student ID, můžete použít anonymní typ v select prohlášení:

    var studentQuery8 =
        from student in students
        let x = student.Scores[0] + student.Scores[1] +
            student.Scores[2] + student.Scores[3]
        where x > averageScore
        select new { id = student.ID, score = x };
    
    foreach (var item in studentQuery8)
    {
        Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);
    }
    
    // Output: 
    // Student ID: 113, Score: 338 
    // Student ID: 114, Score: 353 
    // Student ID: 116, Score: 369 
    // Student ID: 117, Score: 352 
    // Student ID: 118, Score: 343 
    // Student ID: 120, Score: 341 
    // Student ID: 122, Score: 368
    

Další kroky

Poté, co jste obeznámeni s základní aspekty práce s dotazy v jazyce C#, jste připraveni přečíst dokumentaci a ukázky pro určitý typ LINQ zprostředkovatele, které vás zajímají:

LINQ to SQL [LINQ to SQL]

LINQ to DataSet

LINQ to XML

LINQ na objekty

Viz také

Úkoly

Návod: Zápis dotazů ve Visual Basic

Koncepty

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

Doplňkové prostředky LINQ

Další zdroje

LINQ (Language-Integrated Query)

Začínáme s dotazy LINQ v jazyce C#