الإرشادات التفصيلية: كتابة استعلامات في #LINQ) C)
هذه الإرشادات التفصيلية توضح ميزات لغة #C التي تستعمل لكتابة تعبير استعلام LINQ . بعد إكمال هذه الإرشادات التفصيلية ستكون على استعداد للانتقال إلى النماذج و وثائق لموفر LINQ محدد يهمك, مثل مكون LINQ to SQL, LINQ إلى DataSets، أو مكون LINQ to XML.
المتطلبات الأساسية
هذه الإرشادات التفصيلية تتطلب Visual Studio 2010.
للحصول على نسخة فيديو لهذا الموضوع، راجع كيف تقوم بما يلي: كتابة استعلامات في #LINQ) C).
إنشاء مشروع #C
لإنشاء مشروع #C يستهدف الإصدار 3.5 من NET Framework.
ابدأ Visual Studio.
من القائمة File (ملف)، أشر إلى New (جديد)، ثم انقر فوق Project (مشروع).
الزاوية الأعلى إلى اليمين من مربع حوار مشروع جديد تحتوي على ثلاثة رموز. انقر فوق الرمز الأيسر و تأكد من أن Framework .NET الإصدار 3.5 قد تم تحديده.
انقر فوق رمز تطبيق وحدة تحكم تحت قوالب Visual Studio المثبتة.
أعط التطبيق الخاص بك اسما جديدا، أو اقبل الاسم الافتراضي وانقر فوق موافق.
لاحظ أن للمشروع الخاص بك مرجع إلى System.Core.dll و توجيه using لمساحة الاسم System.Linq.
إنشاء مصدر بيانات في الذاكرة
مصدر البيانات للاستعلامات هو قائمة بسيطة لكائنات Student. كل سجل في Student له اسم أول، اسم أخير و صفيف من الأعداد الصحيحة الذي يمثل دراجات اختباراتهم في الصف. انسخ التعليمات البرمجية لمشروعك. لاحظ الخصائص التالية:
الفئة Student تتكون من خصائص منفذه بشكل تلقائي.
يتم تهيئة كل طالب في القائمة بواسطة مهيئ كائن.
يتم تهيئة القائمة نفسها بواسطة مهيئ مجموعة.
سيتم تهيئة بنية البيانات بالكامل وإنشاء مثيل لها بدون استدعاءات صريحة إلى أي مُنشئ أو وصول إلى عضو صريح. لمزيد من المعلومات حول هذه الميزات الجديدة، راجع خصائص يتم التنفيذ التلقائي (C# البرمجة الدليل) و كائن و مجموعة المُهيآت (C# البرمجة الدليل).
لإضافة مصدر البيانات
أضف الفئة Student و قائمة الطلاب المهيئة إلى الفئة Program في المشروع الخاص بك.
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} } };
لإضافة طالب جديد إلى قائمة الطلاب
- أضف Student إلى قائمة Students و استخدم اسم و درجات اختبار من اختيارك. حاول كتابة معلومات الطالب الجديدة من أجل تعلم بناء الجملة لمهيئ الكائن بشكل أفضل.
إنشاء الاستعلام
لإنشاء استعلام بسيط
في أسلوب Main للتطبيق، أنشئ استعلام بسيط ينتج عند تنفيذه قائمة لكل الطلاب الذين حصلوا على درجة أعلى من 90 في الامتحان الأول. لاحظ أنه بسبب تحديد كل الكائن Student، نوع الاستعلام هو IEnumerable<Student>. على الرغم من أن التعليمات البرمجية يمكنها ايضاً استخدام كتابة ضمنية بواسطة استخدام الكلمة الأساسية var, الكتابة الصريحة تستخدم للنتائج المبينة بوضوح. لمزيد من المعلومات حول var, راجع ضمنيًا مكتوب المتغيرات المحلية (برمجة دليل C#).)
لاحظ ايضاً أن متغير نطاق الاستعلام، student، يخدم كمرجع لكل Student في المصدر، موفراً دخول عضو لكل كائن.
// 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;
تنفيذ الاستعلام
لتنفيذ الاستعلام
قم الأن بكتابة التكرار الحلقي foreach الذي سوف يتسبب بتنفيذ الاستعلام. لاحظ التالي حول التعليمات البرمجية:
كل عنصر في التسلسل الذي تم إرجاعه يتم الوصول إليه من خلال متغير التكرار في التكرار الحلقي foreach.
نوع هذا المتغير هو Student، و نوع متغير الاستعلام هو متوافق، IEnumerable<Student>.
بعد إضافة هذه التعليمات البرمجية، قم ببناء و تشغيل التطبيق بالضغط على Ctrl + F5 لترى النتيجة في نافذة وحدة التحكم
// Execute the query.
// var could be used here also.
foreach (Student student in studentQuery)
{
Console.WriteLine("{0}, {1}", student.Last, student.First);
}
لإضافة شرط تصفية أخر.
يمكنك جمع شروط Boolean متعددة في بند where من أجل صقل الاستعلام في المستقبل . التعليمات البرمجية التالية تضيف شرط ليقوم الاستعلام بإرجاع الطلاب الذين كانت نتيجة اختبارهم الأول أعلى من 90 و نتيجة اختبارهم الأخير اقل من 80. البند where يجب أن يشابه التعليمات البرمجية التالية.
where student.Scores[0] > 90 && student.Scores[3] < 80
لمزيد من المعلومات، راجع حيث جملة (C# مرجع).
تعديل الاستعلام
لترتيب النتائج
من الأسهل فحص النتائج إذا كانت في نوع من الترتيب. يمكنك ترتيب التسلسل الذي تم إرجاعه بواسطة أي حقل يمكن الوصول إليه في عناصر المصدر. على سبيل المثال، البند orderby التالي يرتب النتائج في ترتيب أبجدي من أ إلى ي حسب الاسم الأخير لكل طالب. أضف البند orderby التالي للاستعلام الخاص بك, بعد العبارة where و قبل العبارة select:
orderby student.Last ascending
قم الآن بتغيير البند orderby بحيث يرتب النتائج في ترتيب عكسي حسب درجة الاختبار الأول من أعلى درجة إلى أقل درجة.
orderby student.Scores[0] descending
تغيير تنسيق السلسلة WriteLine بحيث يمكنك مشاهدة الدرجات:
Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);
لمزيد من المعلومات، راجع جملة orderby (C# مرجع).
لتجميع النتائج
التجميع هو قدرة فعالة في تعبيرات الاستعلام. ينتج الاستعلام مع بند مجموعة تسلسل من مجموعات, وتحتوي كل مجموعة نفسها Key و تسلسل يتكون من كل أعضاء تلك المجموعة. الاستعلام الجديد التالي يقوم بتجميع الطلاب باستخدام الحرف الأول من الاسم الأخير كمفتاح.
// studentQuery2 is an IEnumerable<IGrouping<char, Student>> var studentQuery2 = from student in students group student by student.Last[0];
لاحظ أن نوع الاستعلام قد تغير الآن. الآن ينتج سلسلة من المجموعات التي لها نوع char كمفتاح, و تسلسل من كائنات Student . لأن نوع الاستعلام قد تم تغييره, التعليمات البرمجية التالية تغير تنفيذ التكرار الحلقي foreach أيضاً:
// 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); } }
ضغط على Ctrl + F5 لتشغيل التطبيق و اعرض النتائج في نافذة وحدة التحكم .
لمزيد من المعلومات، راجع المجموعة عبارة (C# مرجع).
لجعل المتغيرات مكتوبة ضمنياً
برمجة IEnumerables بوضوح من IGroupings يمكنك أن تصبح مملة بسرعة. يمكنك كتابة نفس الاستعلام و التكرار الحلقي foreach بشكل ملائم أكثر باستخدام var. لا تغير الكلمة الأساسية var أنواع الكائنات الخاصة بك; هي فقط ترشد برنامج التحويل البرمجي على استنتاج الأنواع. غير نوع studentQuery و متغير التكرار group إلى var ثم أعد تشغيل الاستعلام. لاحظ أنه في التكرار الحلقي foreach الداخلي ، لا يزال متغير التكرار من نوع Student، و يعمل الاستعلام كما كان يعمل في السابق. غير متغير التكرار s إلى var و قم بتشغيل الاستعلام مرة أخرى. سترى أنك تحصل على نفس النتائج تماماً
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); } }
للحصول على مزيد من المعلومات حول var، راجع ضمنيًا مكتوب المتغيرات المحلية (برمجة دليل C#).
لترتيب المجموعات بواسطة قيمة المفتاح الخاص بها
عند تشغيل الاستعلام السابق ، لاحظ أن المجموعات ليست بالترتيب الأبجدي. لتغيير ذلك، يجب توفير بند orderby بعد البند group. لكن لاستخدام بند orderby، تحتاج أولاً معرّف يخدم كمرجع للمجموعات التي تم إنشائها بواسطة بند group. توفر المعرّف باستخدام الكلمة الأساسية into كما يلي:
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); } }
عند تشغيل هذا الاستعلام ، سترى المجموعات الأن مرتبة بترتيب أبجدي.
لتقديم معرّف باستخدام let
يمكنك استخدام الكلمة الأساسية let لتقديم معرّف لأي نتيجة تعبير في تعبير الاستعلام. يمكن أن يكون هذا المعرّف ملائماً, كما في المثال التالي، أو يمكنه تحسين الأداء بواسطة تخزين نتائج التعبير بحيث لا يتوجب حسابه مرات متعددة.
// 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); }
لمزيد من المعلومات، راجع السماح جملة (C# مرجع).
لاستخدام بناء جملة الأسلوب في تعبير استعلام
كما هو موضح في بناء جملة الاستعلام LINQ مقابل أسلوب البناء (C#)، بعض عمليات الاستعلام يمكن التعبير عنها فقط عن طريق استخدام بناء جملة الأسلوب. التعليمات البرمجية التالية تقوم بحساب إجمالي الدرجات لكل Student في تسلسل المصدر, ثم تستدعي الأسلوب Average() على نتائج ذلك الاستعلام لحساب متوسط الدرجات للصف. لاحظ وضع الأقواس حول تعبير الاستعلام.
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);
للتحويل أو العرض في البند select
من الشائع جداً أن يقوم الاستعلام بإنتاج تسلسل تختلف عناصره عن العناصر في تسلسل المصدر. احذف أو علق خارج الاستعلام الخاص بك السابق و نفذ التكرار الحلقي، واستبدله بالتعليمات البرمجية التالية. لاحظ أن الاستعلام يقوم بإرجاع تسلسل من سلاسل (ليست Students) ، كما تنعكس هذه الحقيقة في التكرار الحلقي foreach.
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); }
التعليمات البرمجية السابقة في هذه الإرشادات التفصيلية تشير إلى أن متوسط درجة الصف هي 334 تقريباً. لإنتاج تسلسل من Students الذين حصلوا على مجموع درجات أكبر من متوسط درجات الصف, مع Student ID الخاصة بهم، يمكنك استخدام نوع مجهول في عبارة select:
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); }
الخطوات التالية
بعد أن تصبح معتاداً على الجوانب الأساسية للعمل مع الاستعلامات في #C، ستكون جاهزاً لقراءة الوثائق و نماذج النوع المعين من موفر LINQ يهمك:
راجع أيضًا:
المهام
الإرشادات التفصيلية: كتابة الإستعلامات في Visual Basic
المبادئ
تعبيرات الاستعلام LINQ (C# البرمجة الدليل)