Instruktaż: Zapisywanie kwerendy w języku 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 to SQL, LINQ do zestawów danych, lub LINQ to XML.
Wymagania wstępne
W tym instruktażu wymaga funkcji, które są wprowadzone w Visual Studio 2008.
Wideo wersję tego tematu, zobacz wideo jak: pisania kwerend w języku C# (LINQ).
Tworzenie projektu C#
Aby utworzyć projekt
Uruchom program Visual Studio.
Na pasku menu wybierz Plik, Nowy, projekt.
Zostanie otwarte okno dialogowe Nowy projekt.
Rozwiń Installed, rozwiń węzeł Szablony, rozwiń węzeł Visual C#, a następnie wybierz polecenie Aplikacji konsoli.
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.
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 auto wdrożone (Podręcznik programowania C#) i Obiektów i kolekcji inicjatorów (Podręcznik programowania 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 Wpisane niejawnie zmiennych lokalnych (C# Programming Guide).)
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ę
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>.
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);
}
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 gdy klauzula (C# odniesienia).
Należy zmodyfikować kwerendę
Do uporządkowania wyników
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
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
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 (C# odniesienia).
Aby pogrupować wyniki
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];
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); } }
Naciśnij klawisze Ctrl + F5, aby uruchomić aplikację i wyświetlić wyniki w konsoli okna.
Aby uzyskać więcej informacji, zobacz Klauzula grupy (C# odniesienia).
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); } }
Aby uzyskać więcej informacji o var., zobacz Wpisane niejawnie zmiennych lokalnych (C# Programming Guide).
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); } }
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); }
Aby uzyskać więcej informacji, zobacz Niech klauzuli (C# odniesienia).
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);
Przekształć lub projektem w klauzuli select
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); }
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); }
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:
Zobacz też
Zadania
Instruktaż: Zapisywanie kwerendy w języku Visual Basic
Koncepcje
Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)