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

مثال على استعلام LINQ

في هذا الفصل، ستتعلم بعض الاستعلامات 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);
الناتج:
Steve
رام

الاستعلام التالي يعود مجموعة من الأجسام المجهولة التي تحتوي فقط على الخاصية 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));
الناتج:
جون
بيل

Group By

يستعيد الاستعلام التالي مجموعات الطلاب المدرجة تحت 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:
جون
Steve
StandardID 2:
بيل
رام

الإخراج يشمل Ron بدون أي StandardID، لذا يتبع 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:
جون
Steve
StandardID 2:
بيل
رام

Left outer join

استخدام الربط الخارجي الأيسر (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));
}
الناتج:
معيار 1:
جون
Steve
معيار 2:
بيل
رام
معيار 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} هو في {1}", group.StudentName, group.StandardName);
}
الناتج:
John في Standard 1
Steve في Standard 1
Bill في Standard 2
Ram في 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("اسم الطالب: {0}, العمر: {1}, رقم المعيار: {2}", s.StudentName, s.Age, s.StandardID));
الناتج:
اسم الطالب: رون، العمر: 21، رقم المعيار: 0
اسم الطالب: جون، العمر: 18، رقم المعيار: 1
اسم الطالب: ستيف، العمر: 21، رقم المعيار: 1
اسم الطالب: بيل، العمر: 18، رقم المعيار: 2
اسم الطالب: رام، العمر: 20، رقم المعيار: 2

الانضمام الداخلي (Inner Join)

var studentWithStandard = from s in studentList
                          join stad in standardList
                          عندما يكون StandardID يساوي stad.StandardID 
                          select new { 
                                  StudentName = s.StudentName, 
                                  StandardName = stad.StandardName 
                              };
studentWithStandard.ToList().ForEach(s => Console.WriteLine("{0} في {1}", s.StudentName, s.StandardName));
الناتج:
John في Standard 1
Steve في Standard 1
Bill في Standard 2
Ram في 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