Wskazówki: pisanie zapytań w C# (LINQ)

W tym instruktażu przedstawiono funkcje języka C#, które służą do zapisywania LINQ kwerendy wyrażeń.Po ukończeniu tego instruktażu będzie gotowy, aby przejść do przykładów i dokumentację na szczególne LINQ dostawcy są Państwo zainteresowani, takich jak LINQ do SQL, LINQ do zestawów danych, lub LINQ do XML.

Wymagania wstępne

W tym instruktażu wymaga funkcji, które są wprowadzone w Visual Studio 2008.

łącze do wideo Wideo wersję tego tematu, zobacz wideo jak: pisania kwerend w języku C# (LINQ).

Tworzenie projektu C#

Aby utworzyć projekt

  1. Uruchom program Visual Studio.

  2. Na pasku menu wybierz Plik, Nowy, projekt.

    Zostanie otwarte okno dialogowe Nowy projekt.

  3. Rozwiń Installed, rozwiń węzeł Szablony, rozwiń węzeł Visual C#, a następnie wybierz polecenie Aplikacji konsoli.

  4. W Nazwa polu tekstowym Wprowadź inną nazwę lub zaakceptuj nazwę domyślną, a następnie wybierz OK przycisk.

    W Eksploratorze rozwiązań pojawi się nowy projekt.

  5. Obwieszczenie, że projekt zawiera odwołanie do System.Core.dll i using w dyrektywie dla System.Linq obszaru nazw.

Utwórz w pamięci źródła danych

Źródło danych dla kwerendy jest prosta lista Student obiektów.Każdy Student rekord ma imię, nazwisko i Tablica wartości całkowitych reprezentujący ich wyniki testów w klasie.Skopiować ten kod do projektu.Należy zwrócić uwagę następujące cechy:

  • Student Klasy składa się z właściwości auto wdrożone.

  • Każdy student na liście jest inicjowany z Inicjator obiektu.

  • Samej listy jest inicjowany z inicjatorze kolekcji.

Ta struktura danych w całości będzie zainicjowany i utworzone bez jawnego wywołania wszelkie Konstruktor lub jawnym Członkowskim dostępu.Aby uzyskać więcej informacji dotyczących nowych funkcji, zobacz Właściwości zaimplementowane automatycznie (Przewodnik programowania w języku C#) i Inicjatory obiektów i kolekcji (Przewodnik programowania w języku C#).

Aby dodać źródło danych

  • Dodać Student klasy i zainicjować listy uczniów do Program klasy do 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} }
    };
    

Aby dodać nowy student/uczeń do listy studentów

  • Dodaj nowy Student do Students listy i użyj nazwy i przetestować wyniki wybranych przez użytkownika.Spróbuj wpisać wszystkie nowe informacje uczniów, aby lepiej poznać składnię dla Inicjator obiektu.

Utwórz kwerendę

Aby utworzyć prostą kwerendę

  • W aplikacji Main metoda, utworzyć prostą kwerendę, która, gdy jest wykonywana, sporządzi listę wszystkich uczniów, których wynik pierwszego badania była większa niż 90.Należy zauważyć, że ponieważ cały Student jest zaznaczony obiekt, typ kwerendy jest IEnumerable<Student>.Mimo że kod może również używać niejawnym określaniem typów za pomocą var. słowa kluczowego, wpisując jawne służy do ilustrowania wyraźnie wyniki.(Aby uzyskać więcej informacji o var, zobacz Niejawnie wpisane zmienne lokalne (Przewodnik programowania w języku C#).)

    Należy zauważyć, że kwerendy zakres zmiennej student, służy jako punkt odniesienia do każdego Student w źródle, zapewniając dostęp Członkowskie dla każdego obiektu.

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

Wykonanie kwerendy

Aby wykonać kwerendę

  1. Teraz zapisać foreach pętli, który spowoduje, że kwerenda ma wykonać.Poniższe informacje o kodzie:

    • Każdy element w sekwencji zwracane jest dostępna za pośrednictwem zmiennej iteracji w foreach pętli.

    • Typ tej zmiennej jest Student, a typ zmiennej zapytania jest zgodny, IEnumerable<Student>.

  2. Po dodaniu tego kodu skompilować i uruchomić aplikację przez naciśnięcie klawiszy Ctrl + F5, aby wyświetlić wyniki w konsoli 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

Aby dodać inny warunek filtru

  • Można łączyć wiele warunków logicznych w where klauzuli w celu dalszego uściślenia kwerendy.Poniższy kod dodaje warunek tak, aby kwerenda zwraca tych uczniów, których wynik pierwszego ponad 90 i których ostatni wynik był mniejszy niż 80.where Klauzula powinien przypominać następujący kod.

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

    Aby uzyskać więcej informacji, zobacz Klauzula where (odwołanie w C#).

Należy zmodyfikować kwerendę

Do uporządkowania wyników

  1. Będzie on ułatwia skanowanie wyniki, jeżeli są one w określonej kolejności.Można zamówić zwracane sekwencją według dowolnego pola dostępne w elementów źródła.Na przykład, następująca orderby klauzuli zamówienia wyniki w porządku alfabetycznym od A do Z zgodnie z ostatnią nazwę każdego studenta.Dodaj następujący orderby klauzuli do kwerendy, natychmiast po where instrukcji i przed select instrukcji:

    orderby student.Last ascending
    
  2. Teraz zmienić orderby klauzuli, tak że zamówienia wyniki w odwrotnej kolejności według wynik pierwszego badania, z najwyższym wynikiem do najmniejszej liczby punktów.

    orderby student.Scores[0] descending
    
  3. Zmiana WriteLine format string, dzięki czemu można zobaczyć wyniki:

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

    Aby uzyskać więcej informacji, zobacz Klauzula orderby (odwołanie w C#).

Aby pogrupować wyniki

  1. Grupowanie jest zaawansowanych możliwości w wyrażeniach kwerend.Kwerendy z klauzulę group produkuje sekwencji grup i każda grupa sama zawiera Key oraz sekwencja, która składa się z wszystkich członków tej grupy.Następującą nową kwerendę grupy studentów, za pomocą pierwszej litery nazwiska jako klucz.

    // studentQuery2 is an IEnumerable<IGrouping<char, Student>> 
    var studentQuery2 =
        from student in students
        group student by student.Last[0];
    
  2. Należy zauważyć, że typ kwerendy zostanie zmieniona.Obecnie wytwarza sekwencji grup, które mają char typu jako klucz i sekwencji Student obiektów.Ponieważ zmienił się typ kwerendy, następujący kod dodaje zmiany foreach wykonanie pętli również:

    // 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. Naciśnij klawisze Ctrl + F5, aby uruchomić aplikację i wyświetlić wyniki w konsoli okna.

    Aby uzyskać więcej informacji, zobacz group — Klauzula (odwołanie w C#).

Aby zmienne niejawnie wpisane

  • Jawnie kodowanie IEnumerables z IGroupings szybko stać się uciążliwa.Można napisać kwerendę tego samego i foreach w pętli, znacznie ułatwia późniejsze za pomocą var.var Słowo kluczowe nie zmienia typów obiektów; to właśnie nakazuje kompilatorowi wywnioskować typy.Zmienianie typu studentQuery i Zmienna iteracji group do var i uruchom ponownie kwerendę.Należy zauważyć, że w wewnętrznej foreach pętli, Zmienna iteracji nadal jest wpisana jako Student, i kwerendy działa tak jak poprzednio.Zmiana s Zmienna iteracji, aby var i uruchom ponownie kwerendę.Widać, że masz dokładnie takie same wyniki.

    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
    

    Aby uzyskać więcej informacji o var., zobacz Niejawnie wpisane zmienne lokalne (Przewodnik programowania w języku C#).

Aby zamówić grup według ich wartości klucz

  • Po uruchomieniu poprzedniej kwerendy, można zauważyć, że grupy nie są w kolejności alfabetycznej.Aby zmienić to ustawienie, należy podać orderby klauzula po group klauzuli.Ale na orderby klauzuli, należy najpierw identyfikator, który służy jako odniesienie do grupy utworzone przez group klauzuli.Podaj identyfikator przy użyciu into słowa kluczowego, w następujący sposób:

    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
    

    Po uruchomieniu tej kwerendy, zobaczysz, że grup teraz są sortowane w kolejności alfabetycznej.

Aby wprowadzić identyfikator przy użyciu let

  • Można użyć let słowo kluczowe, aby wprowadzić identyfikator wszelkie wynik wyrażenia w wyrażeniu kwerendy.Ten identyfikator może być wygodne, jak w poniższym przykładzie, lub go może zwiększyć wydajność dzięki przechowywaniu wyniki wyrażenia, tak aby nie trzeba obliczyć wiele razy.

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

    Aby uzyskać więcej informacji, zobacz Klauzula Let (odwołanie w C#).

Aby użyć metody składni w wyrażeniu kwerendy

  • Zgodnie z opisem w Składnia zapytania i metody w technologii LINQ (C#), niektóre operacje kwerendy może być wyrażone tylko przy użyciu składni metody.Poniższy kod oblicza sumę punktów dla każdego Student w sekwencji źródłowej, a następnie wywołania Average() metody na wyników tej kwerendy, aby obliczyć średni wynik tej klasy.Należy zauważyć, umieszczania nawiasów wokół wyrażenie kwerendy.

    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
    

Przekształć lub projektem w klauzuli select

  1. Jest ono często na produkcji sekwencji, w której elementy różnią się od elementów w sekwencjach źródła kwerendy.Usunąć lub skomentować poprzedniej kwerendy i wykonywanie pętli i zamienić go na następujący kod.Należy zauważyć, że kwerenda zwraca Sekwencja ciągów (nie Students), a fakt ten jest uwzględniana w foreach pętli.

    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. Kod wcześniej w tym instruktażu wskazano, że wynik średniej klasy jest około 334.Do produkcji sekwencji Students których całkowita liczba punktów jest większa od średniej klasy, wraz z ich Student ID, można użyć typ anonimowy w select instrukcji:

    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
    

Następne kroki

Po są zaznajomieni z podstawowych aspektów pracy z kwerendami w języku C#, można przystąpić do odczytania dokumentacja i przykłady dla określonego typu LINQ są Państwo zainteresowani dostawcy:

LINQ to SQL [LINQ to SQL]

LINQ to DataSet

LINQ to XML

LINQ do obiektów

Zobacz też

Zadania

Wskazówki: Pisanie zapytań w Visual Basic

Koncepcje

Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#)

Uzupełniające zasoby LINQ

Inne zasoby

LINQ (zapytania o języku zintegrowanym)

Wprowadzenie do korzystania z LINQ w C#