Avatar ·

إرجاع IEnumerable<T> أم IQueryable<T> في C#: ما الفرق وماذا تختار؟

مرحبًا بالجميع! أنا مطور C# مبتدئ، أعمل مع Entity Framework وLINQ. كثيرًا ما أرى في كود زملائي أنهم يعيدون من الدوال إما `IEnumerable` أو `IQueryable`. في البداية اعتقدت أنهما قابلان للتبادل، لكن لاحظت سلوكًا غريبًا. إليك مثال. لدي دالة تحصل على قائمة الطلبات: ```csharp public IEnumerable GetOrders() { using (var db = new MyDbContext()) { return db.Orders.Where(o => o.IsActive); } } ``` ثم أستدعيها وأطبق تصفية إضافية: ```csharp var orders = GetOrders().Where(o => o.Total > 100).ToList(); ``` توقعت أن يتم إرسال استعلام SQL واحد إلى قاعدة البيانات بشرطين (`IsActive = true AND Total > 100`)، لكن الـ profiler أظهر أنه يتم أولاً جلب جميع الطلبات النشطة، ثم تتم التصفية حسب `Total` في ذاكرة التطبيق! هذا بطيء جدًا إذا كان هناك العديد من الطلبات. أما إذا غيرت نوع الإرجاع إلى `IQueryable`، فكل شيء يعمل كما يجب — يتم إنشاء SQL