اتكلمنا عن الـ Cs Enumerable

الفرق بين IEnumerable، IQueryable، و ICollection في C# بيظهر في طريقة التعامل مع البيانات، الأداء، والتصفية باستخدام Filter (WHERE). كل واحدة منهم ليها وظيفة مميزة واستخدامات محددة.


1. IEnumerable

الوظيفة:

  • الـIEnumerable تُستخدم للتعامل مع التكرار (Iteration) على مجموعة بيانات (Collection) بشكل تسلسلي.
  • مناسبة للبيانات اللي تم تحميلها بالكامل في الذاكرة.

المميزات:

  1. التنفيذ الفوري (Immediate Execution):
    • أي فلترة (مثل WHERE) يتم تطبيقها على البيانات في الذاكرة مباشرة.
  2. التصفية بعد تحميل البيانات:
    • البيانات يتم جلبها من المصدر بالكامل أولًا، وبعدها تُطبق الفلترة في الذاكرة.

استخدامها مع WHERE:

  • يتم تحميل كل البيانات أولًا من المصدر، ثم تُطبق فلترة:
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var filtered = numbers.Where(n => n > 3); // يتم الفلترة في الذاكرة

الأداء:

  • أقل كفاءة لو كان حجم البيانات كبير لأنها تعمل على البيانات المحملة بالفعل.

2. IQueryable

الوظيفة:

  • الـIQueryable تُستخدم للتعامل مع الاستعلامات (Query) على البيانات التي قد تكون موجودة في قاعدة بيانات أو مصدر خارجي.
  • تدعم التنفيذ المؤجل (Deferred Execution)، مما يجعلها أكثر كفاءة عند التعامل مع قواعد البيانات الكبيرة.

المميزات:

  1. التنفيذ المؤجل:
    • يتم ترجمة الفلترة (مثل WHERE) إلى استعلام SQL، ولا يتم تنفيذها إلا عند الحاجة (مثل ToList()).
  2. التصفية على مستوى المصدر:
    • يتم إرسال الفلترة إلى قاعدة البيانات مباشرة لتقليل البيانات المحملة.

استخدامها مع WHERE:

  • الفلترة تُطبق على مستوى المصدر:
IQueryable<Employee> employees = dbContext.Employees;
var filtered = employees.Where(e => e.Salary > 5000); 
// يتم تحويله لاستعلام SQL

الأداء:

  • أكثر كفاءة عند التعامل مع قواعد بيانات كبيرة لأنها تُقلل حجم البيانات المحملة.

3. ICollection

الوظيفة:

  • الـICollection هي واجهة تُستخدم لإدارة مجموعة بيانات (Collection) يمكن تعديلها (إضافة/حذف) وتسمح بالتكرار (Iteration).
  • مشتقة من IEnumerable، لكن تضيف ميزات إضافية.

المميزات:

  1. إدارة البيانات:
    • تتيح إضافة وإزالة البيانات باستخدام Add و Remove.
  2. تعمل في الذاكرة:
    • البيانات تكون محملة بالكامل في الذاكرة.

استخدامها مع WHERE:

  • مثل IEnumerable، يتم تحميل البيانات أولًا، ثم تُطبق الفلترة:
ICollection<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var filtered = numbers.Where(n => n > 3); // يتم الفلترة في الذاكرة

الأداء:

  • أقل كفاءة مع البيانات الكبيرة لأنها تتعامل مع كل البيانات المحملة.

الفرق في الأداء واستخدام WHERE (فلترة البيانات):

الميزةIEnumerableIQueryableICollection
تنفيذ الاستعلاميتم في الذاكرة بعد تحميل البياناتيتم على مستوى المصدريتم في الذاكرة بعد تحميل البيانات
فلترة (WHERE)بعد تحميل البياناتقبل تحميل البيانات (على مستوى المصدر)بعد تحميل البيانات
أداء البيانات الكبيرةأقل كفاءةأكثر كفاءةأقل كفاءة
إمكانية التعديلغير قابلة للتعديلغير قابلة للتعديلقابلة للتعديل
تنفيذ مؤجل؟لا (تنفيذ فوري)نعملا

أمثلة عملية:

IEnumerable:

IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var filtered = numbers.Where(n => n > 3); // يتم تحميل كل البيانات أولًا
foreach (var num in filtered)
{
    Console.WriteLine(num); // يطبع 4 و 5
}

IQueryable:

IQueryable<Employee> employees = dbContext.Employees;
var filtered = employees.Where(e => e.Salary > 5000); // يتم تنفيذ الفلترة في SQL
foreach (var emp in filtered)
{
    Console.WriteLine(emp.Name); // يعرض أسماء الموظفين
}

ICollection:

ICollection<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.Add(6);
var filtered = numbers.Where(n => n > 3); // يتم الفلترة بعد تحميل البيانات
foreach (var num in filtered)
{
    Console.WriteLine(num); // يطبع 4 و 5 و 6
}

متى تستخدم؟

  • IEnumerable: لما تكون بتتعامل مع بيانات صغيرة محملة بالكامل.
  • IQueryable: لما تكون بتتعامل مع مصدر بيانات خارجي (مثل قاعدة بيانات) وتهتم بالأداء.
  • ICollection: لما تحتاج تعديل البيانات في الذاكرة.