المشاركات

عرض الرسائل ذات التصنيف LINQ

LINQ - الأنواع المجهولة (Anonymous Types)

LINQ - الأنواع المجهولة (Anonymous Types) الأنواع المجهولة ( Anonymous Types ) هي طريقة لإنشاء كائنات بدون الحاجة إلى إنشاء class أو struct مسبقًا. تُستخدم كثيرًا مع LINQ لتجميع نتائج تحتوي على خصائص معينة فقط من المصدر. 1. ما هو النوع المجهول؟ هو نوع يتم إنشاؤه في وقت التنفيذ باستخدام الكلمة المفتاحية new ، ويحتوي على مجموعة من الخصائص يتم تحديدها مباشرة. مثال أساسي: var person = new { Name = "Mahmoud", Age = 30 }; Console.WriteLine(person.Name); // Mahmoud Console.WriteLine(person.Age); // 30 2. استخدام Anonymous Types مع LINQ يُستخدم غالبًا عند الرغبة في تحديد خصائص معينة فقط من كائنات المصدر بدون إنشاء نوع جديد. مثال عملي باستخدام LINQ: using System; using System.Collections.Generic; using System.Linq; class Program { class Student { public string Name { get; set; } public int Grade { get; set; } public int Age { get; set; } } static void Main() { List<Student> students = new...

Differences Between LINQ JOIN and GROUP JOIN Methods

Differences Between LINQ JOIN and GROUP JOIN Methods في LINQ، تُستخدم دالتي Join و GroupJoin لربط مجموعتين من البيانات بناءً على مفتاح مشترك، لكنهما تختلفان في كيفية التعامل مع النتائج وطريقة العرض. دالة Join: الغرض: تنفيذ عملية Inner Join بين مجموعتين، حيث تُعاد فقط العناصر التي تتطابق مفاتيحها في كلا المجموعتين. النتيجة: تُعيد مجموعة مسطحة (flat) من العناصر المتطابقة. مثال على استخدام Join: var result = from c in categories join p in products on c.CategoryId equals p.CategoryId select new { c.CategoryName, p.ProductName }; في هذا المثال، يتم ربط المجموعتين categories و products على أساس CategoryId ، وتُعاد فقط الأزواج التي يوجد لها تطابق في كلا المجموعتين. دالة GroupJoin: الغرض: تنفيذ عملية Group Join ، حيث تُعاد كل العناصر من المجموعة الخارجية مع مجموعة من العناصر المتطابقة من المجموعة الداخلية. النتيجة: تُعيد مجموعة هرمية (hierarchical) حيث يكون لكل عنصر من المجموعة الخارجية مجموعة من العناصر المتطابقة م...

الفرق بين Cast و OfType في LINQ

الفرق بين Cast و OfType في LINQ في LINQ، كل من Cast<T>() و OfType<T>() تُستخدم لتحويل تسلسل من عناصر إلى نوع معين. لكن كل واحدة منهما تعمل بطريقة مختلفة، ودي أهم الفروقات بينهم. 1. Cast() الاستخدام: تُستخدم لتحويل كل عنصر في تسلسل IEnumerable إلى نوع معين T . السلوك: إذا كان أي عنصر لا يمكن تحويله إلى T → يتم رمي استثناء InvalidCastException . يُفترض أن كل العناصر قابلة للتحويل إلى T . مثال: ArrayList list = new ArrayList() { 1, 2, 3, "four", 5 }; var result = list.Cast<int>(); foreach (var item in result) { Console.WriteLine(item); } النتيجة: 1 2 3 (ثم استثناء) الخطأ: System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Int32'. 2. OfType() الاستخدام: تُستخدم لتصفية العناصر من تسلسل IEnumerable بحيث تُرجع فقط العناصر التي يمكن تحويلها إلى النوع T . السلوك: تتجاهل بصمت العناصر التي لا تتطابق مع النوع T . لا يتم رمي استثناءات. ...

Cast() وOfType

Differences Between Cast<T>() and OfType<T>() in LINQ في LINQ، تُستخدم الدالتان Cast<T>() و OfType<T>() لتحويل أو تصفية عناصر مجموعة غير عامة ( IEnumerable ) إلى نوع محدد ( T ). ومع ذلك، هناك اختلافات جوهرية في كيفية تعامل كل منهما مع العناصر التي لا يمكن تحويلها إلى النوع المستهدف. دالة Cast<T>(): الغرض: تحاول تحويل كل عنصر في المجموعة إلى النوع المحدد ( T ). السلوك: إذا واجهت عنصرًا لا يمكن تحويله إلى النوع T ، فإنها ترمي استثناءً من نوع InvalidCastException . الاستخدام المناسب: عند التأكد من أن جميع العناصر في المجموعة هي من النوع T أو يمكن تحويلها إليه، وتريد أن يتم إعلامك بأي خطأ في التحويل عبر استثناء. مثال على Cast<T>(): using System; using System.Collections; using System.Collections.Generic; using System.Linq; class Program { static void Main() { ArrayList list = new ArrayList { 10, 20, 30, "50" }; try { IEnumerable<int> result = list.Cast...

Cast() في LINQ

شرح دالة Cast<T>() في LINQ دالة Cast<T>() في LINQ تُستخدم لتحويل عناصر مجموعة غير عامة ( non-generic collection ) إلى نوع محدد ( T )، مما يتيح لك استخدام عمليات LINQ القياسية على هذه المجموعة. تُنفذ هذه الدالة باستخدام التنفيذ المؤجل (deferred execution)، أي أن عملية التحويل لا تتم إلا عند اجتياز العناصر فعليًا (مثلًا باستخدام foreach ). مثال على استخدام Cast<T>(): using System; using System.Collections; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // إنشاء ArrayList تحتوي على عناصر من أنواع مختلفة ArrayList list = new ArrayList { 1, 2, "three", 4 }; try { // محاولة تحويل جميع العناصر إلى نوع int باستخدام Cast<int>() IEnumerable<int> result = list.Cast<int>(); foreach (int number in result) { Console.WriteLine(number); } } catch (InvalidC...

ToDictionary() في LINQ

شرح دالة ToDictionary() في LINQ دالة ToDictionary() في LINQ تُستخدم لتحويل تسلسل من العناصر إلى قاموس ( Dictionary<TKey, TValue> )، حيث يتم تحديد المفتاح والقيمة لكل عنصر باستخدام دوال اختيارية. هذه الدالة مفيدة جدًا لإنشاء قاموس من بيانات قائمة، يكون فيه لكل مفتاح قيمة مرتبطة به. الصيغة العامة: Dictionary<TKey, TValue> dictionary = source.ToDictionary(keySelector); source : التسلسل الأصلي من النوع IEnumerable<TSource> . keySelector : دالة تُحدد المفتاح لكل عنصر. يمكن أيضًا تحديد دالة لاختيار القيمة لكل عنصر: Dictionary<TKey, TValue> dictionary = source.ToDictionary(keySelector, elementSelector); elementSelector : دالة تُحدد القيمة المقابلة لكل عنصر. مثال عملي: using System; using System.Collections.Generic; using System.Linq; public class Product { public int ID { get; set; } public string Name { get; set; } public double Price { get; set; } } public class Program { public static void Main() {...

LINQ ToList() و ToArray()

شرح ToList() و ToArray() في LINQ في هذا الدرس، سنتعرف على كيفية استخدام دالتي ToList() و ToArray() في LINQ لتحويل نتائج الاستعلام إلى قائمة ( List<T> ) أو مصفوفة ( T[] ). كلا الدالتين تُستخدمان لتنفيذ التنفيذ الفوري (Immediate Execution) ، مما يعني أن الاستعلام يتم تنفيذه في اللحظة التي تُستدعى فيها إحدى الدالتين وتُخزّن النتيجة في الذاكرة. الصيغة العامة: List<T> listResult = query.ToList(); T[] arrayResult = query.ToArray(); مثال عملي باستخدام ToList(): List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers .Where(n => n % 2 == 0) .ToList(); foreach (var num in evenNumbers) { Console.WriteLine(num); } الناتج: 2 4 مثال عملي باستخدام ToArray(): int[] array = numbers .Where(n => n > 3) .ToArray(); foreach (var num in array) { Console.WriteLine(num); } الناتج: 4 5 الفرق بين ToList() و ToArray(): المقارنة ToList() ToArray() نوع النتيجة List<T> ...

LINQ - Extension Methods

LINQ - Extension Methods في LINQ ، تعتمد أغلب الوظائف على Extension Methods ، وهي طرق إضافية (Methods) تُضاف إلى IEnumerable و IQueryable دون الحاجة إلى تعديل الكود الأصلي للكائنات. هذه الطرق توفر طريقة مرنة وسهلة للاستعلام عن البيانات وتنفيذ العمليات المختلفة عليها. 1. ما هي Extension Methods في LINQ؟ 🔹 الموقع: توجد في System.Linq 🔹 تُضاف إلى: IEnumerable<T> و IQueryable<T> 🔹 الهدف: توسيع الوظائف المتاحة للكائنات دون تعديل الشيفرة المصدرية 🔹 الاستخدام الرئيسي: كتابة استعلامات LINQ باستخدام Method Syntax مثال على Extension Method using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // استخدام LINQ Extension Method var evenNumbers = numbers.Where(n => n % 2 == 0); Console.WriteLine("الأرقام الزوجية:"); foreach (var num in evenNumbers) {...

LINQ - Differences between IEnumerable and IQueryable

الفرق بين IEnumerable و IQueryable في C# في C# LINQ ، هناك نوعان رئيسيان من الواجهات المستخدمة للاستعلام عن البيانات: IEnumerable IQueryable يُعد فهم الفرق بينهما أمرًا أساسيًا لتحسين أداء التطبيقات، خاصة عند التعامل مع قواعد البيانات و مجموعات البيانات الكبيرة . 1. ما هي IEnumerable? 🔹 المساحة: System.Collections.Generic 🔹 مكان التنفيذ: في الذاكرة (In-Memory) 🔹 التنفيذ: فوري (Immediate Execution) 🔹 مصدر البيانات: مثل List و Array 🔹 الأداء: أقل كفاءة مع البيانات الكبيرة مثال: using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0); foreach (var num in evenNumbers) { Console.WriteLine(num); } } } كيف يعمل؟ يتم تحميل البيانات كاملة ثم تصفيتها في الذاكرة. لا يتم توليد SQL. 2. ما ه...

LINQ - Ways to Write LINQ

طرق كتابة استعلامات LINQ في C# في LINQ ، يمكننا كتابة الاستعلامات بثلاث طرق رئيسية: Query Syntax (بناء الجملة الاستعلامي) Method Syntax (بناء الجملة القائم على الدوال) Mixed Syntax (خليط من الطريقتين) لكل طريقة ميزاتها الخاصة، وسنتعرف عليها بالتفصيل. 1. Query Syntax (بناء الجملة الاستعلامي) يعتمد هذا النمط على كتابة الاستعلام بطريقة مشابهة لـ SQL ، ويستخدم الكلمات المفتاحية مثل from ، where ، select . مثال على Query Syntax using System; using System.Linq; using System.Collections.Generic; class Program { static void Main() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = from num in numbers where num % 2 == 0 select num; Console.WriteLine("الأرقام الزوجية:"); foreach (var num in evenNumbers) { Console.WriteLine(num); } } } تحليل الكود: from num in numbers → نحدد مصدر الب...

LINQ - Overview

  نظرة عامة على LINQ LINQ ، والتي تعني Language Integrated Query ، هي تقنية مقدمة في .NET Framework 3.5 تتيح للمطورين كتابة استعلامات مباشرة داخل لغات البرمجة المدعومة، مثل C# و VB.NET . توفر LINQ طريقة موحدة للاستعلام عن مصادر بيانات مختلفة مثل Collections ، Databases ، XML ، والمزيد. لماذا LINQ؟ قبل LINQ ، كان التعامل مع البيانات من مصادر مختلفة يتطلب معرفة بعدة لغات وتقنيات، مثل SQL لقواعد البيانات و XPath/XSLT لملفات XML . لكن مع LINQ ، يمكن استخدام نفس نمط الاستعلام لمختلف مصادر البيانات، مما يبسط عملية التطوير ويحسن قابلية الصيانة. مكونات LINQ الرئيسية: LINQ to Objects – يستخدم للاستعلام عن Collections مثل List و Array . LINQ to SQL – يسمح بالتفاعل مع SQL Server Database باستخدام كود C# أو VB.NET مباشرةً. LINQ to XML (XLinq) – يُستخدم لمعالجة ملفات XML بطريقة أكثر كفاءة من XPath . LINQ to Entities (Entity Framework) – يوفر طريقة مرنة للاستعلام عن Databases باستخدام Entity Framework . LINQ to DataSet – يسمح بالاستعلام عن البيانات المخزنة في...

LINQ - Deferred Execution

LINQ - Deferred Execution Deferred Execution في LINQ هو تأجيل تنفيذ الاستعلام حتى يتم استدعاؤه فعليًا، وليس عند تعريفه. كيف يعمل؟ عندما تكتب استعلام LINQ، فإنه لا يتم تنفيذه فورًا، بل يتم تحويله إلى كائن يمكن تشغيله لاحقًا عند الحاجة إلى البيانات. يتم تنفيذ الاستعلام فقط عند محاولة الوصول إلى العناصر، مثل: استخدام حلقة foreach استدعاء ToList() , ToArray() , Count() , أو أي دالة تنفذ الاستعلام بالفعل مثال على Deferred Execution List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // تعريف الاستعلام (لم يتم تنفيذه بعد) var query = numbers.Where(n => n > 2); // تنفيذ الاستعلام عند المرور عليه foreach (var num in query) { Console.WriteLine(num); } هنا، يتم تنفيذ query عند تشغيل حلقة foreach وليس عند تعريفه. متى يحدث Immediate Execution؟ إذا استخدمت دالة مثل ToList() , ToArray() , Count() ، فسيتم تنفيذ الاستعلام فورًا: var result = numbers.Where(n => n > 2).ToList(); // ي...