English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
لفهم لماذا يجب علينا استخدام LINQ، دعونا نرى بعض الأمثلة. لنفترض أنك تريد البحث عن قائمة بالطلاب المراهقين من سلسلة من كائنات Student.
في C#2.0 قبل، يجب علينا استخدام "foreach" أو "for" الدورات لاستكشاف مجموعة للبحث عن عنصر معين. على سبيل المثال، يجب علينا كتابة الكود التالي للبحث عن جميع كائنات الطلاب في سلسلة من الطلاب الذين تتراوح أعمارهم بين 12 و 20 سنة (منتصف المراهقة 13 إلى 19 سنة):
class Student { public int StudentID { get; set; } public String StudentName { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", Age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", Age = 25 }, new Student() { StudentID = 4, StudentName = "Ram", Age = 20 }, new Student() { StudentID = 5, StudentName = "Ron", Age = 31 }, new Student() { StudentID = 6, StudentName = "Chris", Age = 17 }, new Student() { StudentID = 7, StudentName = "Rob", Age = 19 }, }; Student[] students = new Student[10]; int i = 0; foreach (Student std in studentArray) { if (std.Age > 12 && std.Age < 20) { students[i] = std; i++; } } } }
استخدام حلقة for معقدة وغير قابلة للحفاظ عليها ومؤثرة في القراءة. أدخل C#2.0 وكانه الممثلين لمعالجة هذا النوع من الحالات، مثلما هو موضح أدناه.
مثال: استخدام الممثلين لاستنساخ العناصر من مجموعة C#2.0
delegate bool FindStudent(Student std); class StudentExtension { public static Student[] where(Student[] stdArray, FindStudent del) { int i = 0; Student[] result = new Student[10]; foreach (Student std in stdArray) if (del(std)) { result[i] = std; i++; } return result; } } class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", Age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", Age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", Age = 25 }, new Student() { StudentID = 4, StudentName = "Ram", Age = 20 }, new Student() { StudentID = 5, StudentName = "Ron", Age = 31 }, new Student() { StudentID = 6, StudentName = "Chris", Age = 17 }, new Student() { StudentID = 7, StudentName = "Rob", Age = 19 }, }; Student[] students = StudentExtension.where(studentArray, delegate(Student std){ return std.Age > 12 && std.Age < 20; }; } } }
لذلك، باستخدام C#2.0، يمكنك استخدام ميزة الديليج لبحث عن طلاب يتوافقون مع أي شرط. لا تحتاج إلى استخدام حلقة for للبحث عن طلاب بمعايير مختلفة. على سبيل المثال، يمكنك استخدام نفس دالة الديليج للبحث عن طلاب بمعرف StudentId 5 أو اسمه Bill، كما يلي:
Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentID == 5; }; // استخدم نفس الديليج لشروط أخرى Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentName == "Bill"; };
يعتقد فريق C# أنهم بحاجة إلى جعل الكود أكثر تكدسًا وسهولة القراءة. لذلك، قاموا في C# 3.0 بإدخال طرق التوسيع، تعبيرات lambda، شجرة التعبيرات، أنواع مجهولة المصدر، واستعلامات LINQ. يمكنك استخدام هذه الميزات (وهي بنية LINQ) للبحث في مجموعات مختلفة للحصول على عناصر النتائج في جملة واحدة.
في هذا المثال، يتم عرض كيفية استخدام استعلام LINQ مع تعبيرات lambda للبحث عن طالب معين من مجموعة الطلاب.
class Program { static void Main(string[] args) { Student[] studentArray = { new Student() { StudentID = 1, StudentName = "John", age = 18 } , new Student() { StudentID = 2, StudentName = "Steve", age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", age = 25 } , new Student() { StudentID = 4, StudentName = "Ram", age = 20 } , new Student() { StudentID = 5, StudentName = "Ron", age = 31 } , new Student() { StudentID = 6, StudentName = "Chris", age = 17 } , new Student() { StudentID = 7, StudentName = "Rob", age = 19 } , }; // استخدام LINQ للبحث عن طلاب المراهقة Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray(); // استخدام LINQ للبحث عن الطالب الأول الذي اسمه Bill Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault(); // استخدام LINQ للبحث عن الطلاب الذين يحملون StudentID 5 Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault(); } }
كما هو موضح في المثال أعلاه، نستخدم في جملة واحدة عمليات LINQ وتعبيرات lambda لتحديد الشروط المختلفة. لذلك، يجعل LINQ الكود أكثر تكدسًا وقابلية للقراءة، ويمكن استخدامه أيضًا لاستعلام مصادر بيانات مختلفة. على سبيل المثال، إذا كان لديك جدول طلاب في قاعدة البيانات بدلاً من مجموعة من كائنات الطلاب في الأعلى، يمكنك استخدام نفس الاستعلام باستخدام Entity Framework للبحث عن الطلاب.
لغة مألوفة (Familiar language): لا يتطلب من المطورين تعلم لغة استعلام جديدة لكل نوع من مصادر البيانات أو تنسيقات البيانات.
أقل كتابة (Less coding): يقلل من كمية الكود الذي يجب كتابته مقارنة بالطرق التقليدية.
الكود القابل للقراءة (Readable code): يجعل LINQ الكود أكثر قابلية للقراءة، مما يسمح للمطورين الآخرين بفهمه والتحكم فيه بسهولة.
طريقة معيارة لاستعلام مصادر بيانات متعددة (Standardized way of querying multiple data sources): يمكن استخدام نفس قواعد LINQ لاستعلام مصادر بيانات متعددة.
أمان الاستعلامات في وقت التجميع (Compile time safety of queries): يقدمه في وقت التجميع نوع التحقق من الأشياء.
دعم IntelliSense (IntelliSense Support): يقدم LINQ دعم IntelliSense للمجموعات العامة.
شكل البيانات (Shaping data): يمكنك البحث عن البيانات بأشكال مختلفة.