اتقان Linq: كيفية تحويل استعلامات SQL إلى صيغة Linq

عند العمل مع قواعد البيانات في .NET، يواجه المطورون غالبًا الحاجة إلى تحويل استعلامات SQL إلى صيغة Linq. أحد السيناريوهات الشائعة هو استخدام استعلام فرعي مع IN لتصفية النتائج بناءً على جدول آخر. ستوجهك هذه المدونة خلال عملية تحويل عبارة SQL SELECT التي تستخدم IN إلى تعبير Linq المقابل. بنهاية هذا المقال، ستكون لديك المعرفة اللازمة للتعامل مع استعلامات مشابهة في مشاريعك الخاصة!

فهم المشكلة

يبدو استعلام SQL الذي نريد ترجمته على النحو التالي:

SELECT Id, Name FROM TableA WHERE TableA.Id IN (SELECT xx from TableB INNER JOIN Table C....)

بعبارات أبسط، الهدف هو اختيار Id و Name من TableA، مع تصفية النتائج حيث يتواجد Id في مجموعة فرعية من القيم المشتقة من استعلام ثانٍ يستخدم الربط.

تحليل الحل

لتحويل هذه العبارة SQL إلى استعلام Linq، اتبع الخطوات التالية:

  1. تحديد الجداول: نحن نتعامل مع ثلاثة جداول: TableA و TableB و TableC.
  2. تحديد العلاقة: يتضمن الاستعلام الفرعي ربطًا، مما يعني أنه يتعين علينا النظر في كيفية ارتباط TableB و TableC للعثور على المعرفات المحددة.
  3. بناء استعلام Linq: في Linq، يمكننا استخدام استعلام متداخل كمرشح.

هيكل استعلام Linq

إليك المعادل Linq للاستعلام SQL المقدم:

from a in TableA 
where (from b in TableB 
       join c in TableC on b.id equals c.id
       where ... // (ظروف تصفية إضافية إذا لزم الأمر)
       select b.id).Contains(a.Id) 
select new { a.Id, a.Name }

تحليل استعلام Linq

  • الاستعلام الخارجي:
    • نبدأ بـ from a in TableA، وهو مشابه لاختيار من الجدول الرئيسي.
  • الاستعلام الداخلي:
    • الجزء الداخلي:
    from b in TableB 
    join c in TableC on b.id equals c.id
    
    • وهذا يقوم بربط TableB بـ TableC بناءً على مطابقات المعرفات، مما يسمح لنا بتصفية النتائج بشكل فعال.
  • شرط التصفية:
    • يمكن استبدال أو توسيع سطر where ... داخل الاستعلام الداخلي بشروط إضافية حسب الحاجة.
  • تحقق من الاحتواء:
    • نتيجة الاستعلام الداخلي، select b.id، يتم تغليفها في استدعاء .Contains(a.Id) لضمان أننا نقوم بتضمين المعرفات التي تم العثور عليها فقط في مجموعة النتائج.
  • الاختيار النهائي:
    • أخيرًا، select new { a.Id, a.Name } يسمح لنا بتشكيل الناتج النهائي ليشمل فقط الحقول المطلوبة.

الخاتمة

يمكن أن يساعد تحويل استعلامات SQL إلى Linq في تسريع عمليات البيانات واستغلال قوة C# مع الحفاظ على القراءة والأداء. إن اتقان هذه العملية التحويلية لا يعزز مهاراتك كمطور فحسب، بل يساعد أيضًا في كتابة كود أنظف وأكثر سهولة في الصيانة.

إذا كان لديك أي أسئلة إضافية حول استخدام Linq في مشاريعك، أو عن تحويلات SQL إلى Linq الأخرى، فلا تتردد في الوصول إلينا في التعليقات أدناه. ترميز سعيد!