- بواسطة x32x01 ||
الفرق بين IEnumerable و IQueryable في C# وليه الموضوع ده مهم؟ 
بص يا صديقي، لو إنت شغال على مشروع .NET أو EF Core أو حتى LINQ بشكل عام، أكيد قابلت الاتنين دول: IEnumerable و IQueryable.
ويمكن في البداية بتحس إنهم زي بعض، بس الحقيقة إن كل واحد فيهم ليه استخدام مختلف تمامًا، وممكن اختيارك الغلط يبوّظ أداء التطبيق عندك ويخليه بطيء بشكل مزعج
.
في البوست ده هنفهم الموضوع بشكل سهل وبسيط كده على بعضه، من غير تعقيد، مع مثال يوضح الفرق بشكل عملي.
أول حاجة: إزاي بنجيب البيانات من الـ Database؟
لما بتيجي تسحب بيانات من قاعدة البيانات، في حاجات بتحصل "وراء الكواليس":
IEnumerable: بترجع كل البيانات الأول
لما تستخدم IEnumerable فكأنك بتقول للقاعدة:
"هاتلي كل البيانات اللي عندك، وأنا هفلتر عندي."
يعني لو عندك 1000 row في الجدول وانت محتاج منهم 10 بس،
هترجع الـ 1000 للـ application وبعدين يبدأ التطبيق يفلتر ويختار الـ 10.
IQueryable: بيفلتر جوه الـ Database
هنا بقى الذكاء 
لما تستخدم IQueryable كأنك بتقول للـ Database:
"فلتر إنت وابعتلي بس اللي أنا عايزه."
يعني نفس المثال اللي فوق، الـ Database هتكتب Query SQL وتتنفذ جوه السيرفر، واللي يرجع لك هو النتيجة بس.
الفرق في التنفيذ: Client Side vs Server Side
نقطة مهمة جدًا: Deferred Execution
الاتنين مش بيجيبوا البيانات فورًا.
الـ Query بتتجهز، لكن مش بتتنفذ إلا لما تعمل حاجة زي:
مثال عملي يوضح الفرق بوضوح
هنا:
هنا:
طب أستخدم مين؟ ومتى؟
نصيحة للمحترفين
افتراضك الافتراضي دايمًا يكون IQueryable.
والليلة كلها إنك متجيبش داتا كتير مالهاش لازمة.
هات بس اللي انت محتاجه.
وده سر السرعة والـ Performance العالية.
خلاصة الموضوع
بص يا صديقي، لو إنت شغال على مشروع .NET أو EF Core أو حتى LINQ بشكل عام، أكيد قابلت الاتنين دول: IEnumerable و IQueryable.
ويمكن في البداية بتحس إنهم زي بعض، بس الحقيقة إن كل واحد فيهم ليه استخدام مختلف تمامًا، وممكن اختيارك الغلط يبوّظ أداء التطبيق عندك ويخليه بطيء بشكل مزعج
في البوست ده هنفهم الموضوع بشكل سهل وبسيط كده على بعضه، من غير تعقيد، مع مثال يوضح الفرق بشكل عملي.
أول حاجة: إزاي بنجيب البيانات من الـ Database؟
لما بتيجي تسحب بيانات من قاعدة البيانات، في حاجات بتحصل "وراء الكواليس":- هل البيانات كلها هترجع للسيرفر وبعدين نفلترها هنا؟

- ولا هنخلي قاعدة البيانات نفسها تفلتر وترجع اللي احنا محتاجينه بس؟

IEnumerable: بترجع كل البيانات الأول
لما تستخدم IEnumerable فكأنك بتقول للقاعدة:"هاتلي كل البيانات اللي عندك، وأنا هفلتر عندي."
يعني لو عندك 1000 row في الجدول وانت محتاج منهم 10 بس،
هترجع الـ 1000 للـ application وبعدين يبدأ التطبيق يفلتر ويختار الـ 10.
مثال كود:
C#:
var users = db.Users.ToList(); // رجعت كل البيانات
var result = users.Where(u => u.Age > 20).ToList(); // الفلترة في الذاكرة ده معناه:
- تحميل كبير على الـ application

- استخدام أكتر للـ RAM

- بطء لو البيانات كبيرة

IQueryable: بيفلتر جوه الـ Database
هنا بقى الذكاء لما تستخدم IQueryable كأنك بتقول للـ Database:
"فلتر إنت وابعتلي بس اللي أنا عايزه."
يعني نفس المثال اللي فوق، الـ Database هتكتب Query SQL وتتنفذ جوه السيرفر، واللي يرجع لك هو النتيجة بس.
مثال كود:
C#:
var result = db.Users
.Where(u => u.Age > 20)
.ToList(); // الفلترة في SQL مش في الذاكرة ده معناه:
- نقل بيانات قليل جدًا

- استغلال قوة قاعدة البيانات

- أداء أسرع بكتير مع البيانات الكبيرة

الفرق في التنفيذ: Client Side vs Server Side
| الخاصية | IEnumerable | IQueryable |
|---|---|---|
| مكان تنفيذ الفلترة | الذاكرة (Client) | الخادم (Database) |
| الأداء مع البيانات الكبيرة | بطيء | سريع |
| أفضل استخدام | بيانات صغيرة / عمليات معقدة | بيانات كبيرة / Queries مباشرة |
| طريقة التعامل | بعد تحميل البيانات | قبل التحميل |
نقطة مهمة جدًا: Deferred Execution
الاتنين مش بيجيبوا البيانات فورًا.الـ Query بتتجهز، لكن مش بتتنفذ إلا لما تعمل حاجة زي:
.ToList().FirstOrDefault().Count()- أو لما تعمل loop: foreach
مثال يوضح:
C#:
var query = db.Users.Where(u => u.Age > 20); // لسه ما اتنفذش
var result = query.ToList(); // هنا بقى اتنفذ فعلاً مثال عملي يوضح الفرق بوضوح
باستخدام IEnumerable:
C#:
var data = db.Users.AsEnumerable(); // جاب كل البيانات
var result = data.Where(u => u.Age > 20).OrderBy(u => u.Name).ToList(); - Where اتنفذت في الذاكرة
- OrderBy اتنفذت في الذاكرة
باستخدام IQueryable:
C#:
var result = db.Users
.Where(u => u.Age > 20)
.OrderBy(u => u.Name)
.ToList(); - كل الفلترة والترتيب اتكتب SQL واتنفذ جوه الـ Database

طب أستخدم مين؟ ومتى؟
استخدم IEnumerable لو:
- البيانات قليلة

- أو هتعمل عمليات غير مدعومة في SQL

- أو محتاج تنفذ logic معقد في الكود

استخدم IQueryable لو:
- البيانات كبيرة جدًا

- وعايز أفضل أداء ممكن

- وبتكتب استعلامات مباشرة على جداول

نصيحة للمحترفين
افتراضك الافتراضي دايمًا يكون IQueryable.والليلة كلها إنك متجيبش داتا كتير مالهاش لازمة.
هات بس اللي انت محتاجه.
وده سر السرعة والـ Performance العالية.
خلاصة الموضوع
- IEnumerable = فلترة بعد تحميل البيانات → مناسب للبيانات الصغيرة.
- IQueryable = فلترة قبل التحميل في SQL → مناسب للبيانات الكبيرة.
- الاتنين عندهم Deferred Execution، يعني التنفيذ بيحصل لما تنادي على الداتا فعلاً.
- اختيارك صح = أداء سريع وتجربة أفضل
.