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属性的匿名对象的Enumerable:
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
以下のクエリは、StandardIDに基づいてリストされた生徒グループを返します:
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
StandardIDが0のない出力が含まれるため、RonはStandardID 0に属しています。
StandardIDを持たない生徒を削除するには、グループ演算子の前にwhere演算子を使用してください:
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
左外部結合(Left outer join)を使用して、各標準に属する生徒を表示します。その標準に割り当てられていない生徒でも、標準名を表示します。
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:
在下面的group by查询示例中,我们对组进行排序并只选择StudentName:
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} is in ",1}, group.StudentName, group.StandardName); }
John is in Standard 1 Steve is in Standard 1 Bill is in Standard 2 Ram is in Standard 2
以下查询按StandardID和Age的升序返回学生列表。
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} is in {1}
John is in Standard 1 Steve is in Standard 1 Bill is in Standard 2 Ram is 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