تكرار السؤال: …
الإجابة المختصرة
تنفذ أوامر UPDATE و DELETE مباشرة في قاعدة البيانات في استعلام واحد دون الحاجة لتحميل السجلات إلى الذاكرة وتتبعها وحفظها بـ SaveChanges().
الشرح
قديماً، لحذف 1,000 مستخدم خامل، كان المطور يضطر لجلب 1,000 كائن في ذاكرة الخادم، وإخبار الـ Change Tracker بحذف كل منها، ثم استدعاء SaveChanges() مما يولد 1,000 أمر SQL منفصل. دوال ExecuteUpdateAsync و ExecuteDeleteAsync تترجم شروط LINQ مباشرة إلى استعلام SQL واحد صريح: DELETE FROM Users WHERE LastLogin < @date، وتنفذ في بضعة مللي ثوانٍ مع صفر استهلاك لذاكرة الخادم.
مثال بالكود
// حذف جماعي فوري باستعلام واحد دون تحميل الكائنات
await dbContext.Users
.Where(u => !u.IsActive && u.CreatedAt < cutoffDate)
.ExecuteDeleteAsync();أخطاء شائعة
- توقع أن ExecuteUpdate و ExecuteDelete ستطلق أحداث وتحديثات الـ Change Tracker في الذاكرة؛ هي تتجاوز الذاكرة تماماً.
أسئلة متابعة
- كيف يعمل متبع التغييرات (Change Tracker) في EF Core ولماذا يجب استخدام AsNoTracking() لاستعلامات القراءة؟
- ما هي الاستعلامات المجمعة مسبقاً (Compiled Queries) في EF Core ومتى تستحق استخدامها؟