English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQAbfragebeispiel

在本节中,您将学习一些复杂的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运算符

    示例:多个Select和where运算符

var studentNames = studentList.Where(s => s.Age > 18)
                              .Select(s => s)
                              .Where(st => st.StandardID > 0)
                              .Select(s => s.StudentName);
Ausgabe:
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));
Ausgabe:
John
Bill

Gruppieren nach

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));
}
Ausgabe:
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 };
Ausgabe:
StandardID 1:
John
Steve
StandardID 2:
Bill
Ram

Linker Outer Join

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));
}
Ausgabe:
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}
}
Ausgabe:
John ist in Standard 1
Steve ist in Standard 1
Bill ist in Standard 2
Ram ist in Standard 2

Sortierung

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});
Ausgabe:
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

InternerJoin(Inner Join)

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});
Ausgabe:
John ist in Standard 1
Steve ist in Standard 1
Bill ist in Standard 2
Ram ist in Standard 2

VerschachtelteAbfragen

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));
Ausgabe:
Steve