الفرق بين IEnumerable و IQueryable مع أمثلة عملية

x32x01
  • بواسطة x32x01 ||
الفرق بين IEnumerable و IQueryable في C# وليه الموضوع ده مهم؟ 🤔
بص يا صديقي، لو إنت شغال على مشروع .NET أو EF Core أو حتى LINQ بشكل عام، أكيد قابلت الاتنين دول: IEnumerable و IQueryable.
ويمكن في البداية بتحس إنهم زي بعض، بس الحقيقة إن كل واحد فيهم ليه استخدام مختلف تمامًا، وممكن اختيارك الغلط يبوّظ أداء التطبيق عندك ويخليه بطيء بشكل مزعج 😅.

في البوست ده هنفهم الموضوع بشكل سهل وبسيط كده على بعضه، من غير تعقيد، مع مثال يوضح الفرق بشكل عملي.



أول حاجة: إزاي بنجيب البيانات من الـ Database؟ 💾

لما بتيجي تسحب بيانات من قاعدة البيانات، في حاجات بتحصل "وراء الكواليس":
  • هل البيانات كلها هترجع للسيرفر وبعدين نفلترها هنا؟ 🤨
  • ولا هنخلي قاعدة البيانات نفسها تفلتر وترجع اللي احنا محتاجينه بس؟ 😎
وده بالظبط الفرق الأساسي بين IEnumerable و IQueryable.



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 🧠
  • بطء لو البيانات كبيرة 🐌
فـ ده مناسب لو البيانات صغيرة أو العمليات معقدة ومينفعش تتعمل داخل الـ database.



IQueryable: بيفلتر جوه الـ Database 👑

هنا بقى الذكاء 😎
لما تستخدم IQueryable كأنك بتقول للـ Database:
"فلتر إنت وابعتلي بس اللي أنا عايزه."

يعني نفس المثال اللي فوق، الـ Database هتكتب Query SQL وتتنفذ جوه السيرفر، واللي يرجع لك هو النتيجة بس.

مثال كود:​

C#:
var result = db.Users
              .Where(u => u.Age > 20)
              .ToList(); // الفلترة في SQL مش في الذاكرة

ده معناه:​

  • نقل بيانات قليل جدًا 📦
  • استغلال قوة قاعدة البيانات 💪
  • أداء أسرع بكتير مع البيانات الكبيرة ⚡



الفرق في التنفيذ: Client Side vs Server Side 🆚

الخاصيةIEnumerableIQueryable
مكان تنفيذ الفلترةالذاكرة (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، يعني التنفيذ بيحصل لما تنادي على الداتا فعلاً.
  • اختيارك صح = أداء سريع وتجربة أفضل 💡.
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
7
x32x01
x32x01
x32x01
الردود
0
المشاهدات
390
x32x01
x32x01
x32x01
الردود
0
المشاهدات
107
x32x01
x32x01
x32x01
الردود
0
المشاهدات
635
x32x01
x32x01
x32x01
الردود
0
المشاهدات
851
x32x01
x32x01
x32x01
الردود
0
المشاهدات
617
x32x01
x32x01
x32x01
الردود
0
المشاهدات
932
x32x01
x32x01
x32x01
الردود
0
المشاهدات
607
x32x01
x32x01
x32x01
الردود
0
المشاهدات
861
x32x01
x32x01
x32x01
الردود
0
المشاهدات
688
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
1,983
المشاركات
2,183
أعضاء أكتب كود
479
أخر عضو
as6318380@gmail
عودة
أعلى