إرجاع 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