اتكلمنا عن الـ Cs Enumerable
الفرق بين IEnumerable
، IQueryable
، و ICollection
في C# بيظهر في طريقة التعامل مع البيانات، الأداء، والتصفية باستخدام Filter (WHERE)
.
كل واحدة منهم ليها وظيفة مميزة واستخدامات محددة.
1. IEnumerable
الوظيفة:
- الـ
IEnumerable
تُستخدم للتعامل مع التكرار (Iteration) على مجموعة بيانات (Collection) بشكل تسلسلي. - مناسبة للبيانات اللي تم تحميلها بالكامل في الذاكرة.
المميزات:
- التنفيذ الفوري (Immediate Execution):
- أي فلترة (مثل
WHERE
) يتم تطبيقها على البيانات في الذاكرة مباشرة.
- أي فلترة (مثل
- التصفية بعد تحميل البيانات:
- البيانات يتم جلبها من المصدر بالكامل أولًا، وبعدها تُطبق الفلترة في الذاكرة.
استخدامها مع 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)، مما يجعلها أكثر كفاءة عند التعامل مع قواعد البيانات الكبيرة.
المميزات:
- التنفيذ المؤجل:
- يتم ترجمة الفلترة (مثل
WHERE
) إلى استعلام SQL، ولا يتم تنفيذها إلا عند الحاجة (مثلToList()
).
- يتم ترجمة الفلترة (مثل
- التصفية على مستوى المصدر:
- يتم إرسال الفلترة إلى قاعدة البيانات مباشرة لتقليل البيانات المحملة.
استخدامها مع WHERE:
- الفلترة تُطبق على مستوى المصدر:
IQueryable<Employee> employees = dbContext.Employees;
var filtered = employees.Where(e => e.Salary > 5000);
// يتم تحويله لاستعلام SQL
الأداء:
- أكثر كفاءة عند التعامل مع قواعد بيانات كبيرة لأنها تُقلل حجم البيانات المحملة.
3. ICollection
الوظيفة:
- الـ
ICollection
هي واجهة تُستخدم لإدارة مجموعة بيانات (Collection) يمكن تعديلها (إضافة/حذف) وتسمح بالتكرار (Iteration). - مشتقة من
IEnumerable
، لكن تضيف ميزات إضافية.
المميزات:
- إدارة البيانات:
- تتيح إضافة وإزالة البيانات باستخدام
Add
وRemove
.
- تتيح إضافة وإزالة البيانات باستخدام
- تعمل في الذاكرة:
- البيانات تكون محملة بالكامل في الذاكرة.
استخدامها مع WHERE:
- مثل
IEnumerable
، يتم تحميل البيانات أولًا، ثم تُطبق الفلترة:
ICollection<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var filtered = numbers.Where(n => n > 3); // يتم الفلترة في الذاكرة
الأداء:
- أقل كفاءة مع البيانات الكبيرة لأنها تتعامل مع كل البيانات المحملة.
الفرق في الأداء واستخدام WHERE (فلترة البيانات):
الميزة | IEnumerable | IQueryable | ICollection |
---|---|---|---|
تنفيذ الاستعلام | يتم في الذاكرة بعد تحميل البيانات | يتم على مستوى المصدر | يتم في الذاكرة بعد تحميل البيانات |
فلترة (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
: لما تحتاج تعديل البيانات في الذاكرة.