English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本节中,您将学习一些复杂的LINQ查询。我们将使用以下学生和标准集合进行查询。
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", Age = 18, StandardID = 1 }, , new Student() { StudentID = 2, StudentName = "Steve", Age = 21, StandardID = 1 }, , new Student() { StudentID = 3, StudentName = "Bill", Age = 18, StandardID = 2 }, , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID = 2 }, , new Student() { StudentID = 5, StudentName = "Ron" , Age = 21 } }; IList<Standard> standardList = new List<Standard>() { new Standard(){ StandardID = 1, StandardName="Standard 1"}, new Standard(){ StandardID = 2, StandardName="Standard 2"}, new Standard(){ StandardID = 3, StandardName="Standard 3"} };
示例:多个Select和where运算符
var studentNames = studentList.Where(s => s.Age > 18) .Select(s => s) .Where(st => st.StandardID > 0) .Select(s => s.StudentName);
Steve Ram
以下查询返回仅具有StudentName属性的匿名对象的可枚举:
var teenStudentsName = from s in studentList where s.age > 12 && s.age < 20 select new { StudentName = s.StudentName }; teenStudentsName.ToList().ForEach(s => Console.WriteLine(s.StudentName));
John Bill
Die folgenden Abfragen geben die Schülergruppen in der Reihenfolge der StandardID zurück:
var studentsGroupByStandard = from s in studentList group s by s.StandardID into sg orderby sg.Key select new { sg.Key, sg }; foreach (var group in studentsGroupByStandard) { Console.WriteLine("StandardID {0}:", group.Key); group.sg.ToList().ForEach(st => Console.WriteLine(st.StudentName)); }
StandardID 0: Ron StandardID 1: John Steve StandardID 2: Bill Ram
Die Ausgabe umfasst Ron, der keinen StandardID hat, daher gehört Ron zu StandardID 0.
Um Schüler ohne StandardID zu löschen, verwenden Sie den where-Operator vor dem Gruppierungsoperator:
var studentsGroupByStandard = from s in studentList where s.StandardID > 0 group s by s.StandardID into sg orderby sg.Key select new { sg.Key, sg };
StandardID 1: John Steve StandardID 2: Bill Ram
Mit dem linken Outer Join (Left outer join) werden alle Schüler unter einer Standardschule angezeigt. Selbst wenn kein Schüler dieser Standardschule zugewiesen ist, wird der Standardname angezeigt.
var studentsGroup = from stad in standardList join s in studentList on stad.StandardID equals s.StandardID into sg select new { StandardName = stad.StandardName, Students = sg }; foreach (var group in studentsGroup) { Console.WriteLine(group.StandardName); group.Students.ToList().ForEach(st => Console.WriteLine(st.StudentName)); }
Standard 1: John Steve Standard 2: Bill Ram Standard 3:
Im folgenden Beispiel der Group By Abfrage sortieren wir die Gruppen und wählen nur StudentName aus:
var studentsWithStandard = from stad in standardList join s in studentList on stad.StandardID equals s.StandardID into sg from std_grp in sg orderby stad.StandardName, std_grp.StudentName select new { StudentName = std_grp.StudentName, StandardName = stad.StandardName }; foreach (var group in studentsWithStandard) { Console.WriteLine("{0} ist in ",1} }
John ist in Standard 1 Steve ist in Standard 1 Bill ist in Standard 2 Ram ist in Standard 2
Die folgende Abfrage gibt die Studentenliste in aufsteigender Reihenfolge nach StandardID und Alter zurück.
var sortedStudents = from s in studentList orderby s.StandardID, s.age select new { StudentName = s.StudentName, Age = s.age, StandardID = s.StandardID;} sortedStudents.ToList().ForEach(s => Console.WriteLine("Student Name: {0}, Age: ",1}, StandardID: {2});
Student Name: Ron, Age: 21, StandardID: 0 Student Name: John, Age: 18, StandardID: 1 Student Name: Steve, Age: 21, StandardID: 1 Student Name: Bill, Age: 18, StandardID: 2 Student Name: Ram, Age: 20, StandardID: 2
var studentWithStandard = from s in studentList join stad in standardList on s.StandardID equals stad.StandardID select new { StudentName = s.StudentName, StandardName = stad.StandardName }; studentWithStandard.ToList().ForEach(s => Console.WriteLine("{0} ist in {1});
John ist in Standard 1 Steve ist in Standard 1 Bill ist in Standard 2 Ram ist in Standard 2
var nestedQueries = from s in studentList where s.age > 18 && s.StandardID == (from std in standardList where std.StandardName == "Standard" 1" select std.StandardID).FirstOrDefault() select s; nestedQueries.ToList().ForEach(s => Console.WriteLine(s.StudentName));
Steve