تكرار السؤال: …
الإجابة المختصرة
تحدث عندما يُولد Include المتعدد استعلام JOIN عملاقاً يضاعف الصفوف المسترجعة بشكل أسي؛ وتحلها AsSplitQuery() بتقسيم الاستعلام إلى استعلامات SQL منفصلة لكل علاقة.
الشرح
إذا كان لدى المدونة مقالات، وكل مقال يحتوي تعليقات ووسوماً، فإن استعلام .Include(p => p.Comments).Include(p => p.Tags) يولد استعلام SQL واحد يحتوي على عدة LEFT JOINs. إذا كان للمقال 20 تعليقاً و10 وسوم، سيعيد خادم SQL عدد 200 صف لنفس المقال مكرراً نصوصه (انفجار ديكارتي). ميزة AsSplitQuery() تفصل العملية لاستعلامات مستقلة تجلب المقالات، ثم التعليقات، ثم الوسوم، وتجمعها في الذاكرة بكفاءة وأمان.
مثال بالكود
var blogs = await dbContext.Blogs
.Include(b => b.Posts)
.ThenInclude(p => p.Comments)
.AsSplitQuery() // يمنع الانفجار الديكارتي ويسرع الشبكة
.ToListAsync();أخطاء شائعة
- استخدام AsSplitQuery دون التأكد من أن قاعدة البيانات تدعم التناسق أو في حالات غياب المعاملات عند تحديث البيانات أثناء القراءة.