การปรับตัวให้ชำนาญใน Linq: วิธีการแปลงคำสั่ง SQL เป็นรูปแบบ Linq

เมื่อทำงานกับฐานข้อมูลใน .NET นักพัฒนามักจะพบความจำเป็นในการแปลงคำสั่ง SQL เป็นรูปแบบ Linq หนึ่งในสถานการณ์ที่พบบ่อยคือการใช้ subquery กับ 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 ถูกพบในชุดค่าที่ได้จากคำสั่งย่อยที่ใช้ join

การแบ่งเบาผลลัพธ์

ในการแปลงคำสั่ง SQL นี้เป็นคำสั่ง Linq ให้ทำตามขั้นตอนเหล่านี้:

  1. ระบุตาราง: เรากำลังจัดการกับตารางสามตาราง: TableA, TableB, และ TableC
  2. ระบุความสัมพันธ์: คำสั่งย่อยเกี่ยวข้องกับการ join ซึ่งหมายความว่าเราต้องพิจารณาว่า TableB และ TableC เกี่ยวข้องกันอย่างไรในการหาค่า ids ที่เฉพาะเจาะจง
  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
    
    • การ join TableB กับ TableC โดยอิงจาก ids ที่ตรงกัน ทำให้เราสามารถกรองผลลัพธ์ได้อย่างมีประสิทธิภาพ
  • เงื่อนไขการกรอง:
    • บรรทัด where ... ภายในคำสั่งในสามารถถูกแทนที่หรือขยายด้วยเงื่อนไขเพิ่มเติมได้ตามต้องการ
  • การตรวจสอบการมีอยู่:
    • ผลลัพธ์ของคำสั่งใน, select b.id จะถูกห่อหุ้มด้วยการเรียก .Contains(a.Id) เพื่อให้แน่ใจว่าเรารวมเฉพาะ ids ที่พบในชุดผลลัพธ์
  • การเลือกขั้นสุดท้าย:
    • สุดท้าย select new { a.Id, a.Name } ช่วยให้เราสร้างผลลัพธ์สุดท้ายให้รวมเฉพาะฟิลด์ที่ต้องการ

สรุป

การแปลงคำสั่ง SQL เป็น Linq สามารถทำให้การดำเนินงานด้านข้อมูลมีประสิทธิภาพมากขึ้นและใช้พลังของ C# ในขณะที่รักษาความชัดเจนและประสิทธิภาพ การชำนาญในกระบวนการแปลงนี้ไม่เพียงแต่ช่วยพัฒนาทักษะของคุณในฐานะนักพัฒนา แต่ยังช่วยในการเขียนโค้ดที่สะอาดและบำรุงรักษาได้ง่ายขึ้น

หากคุณมีคำถามเพิ่มเติมเกี่ยวกับการใช้ Linq ในโครงการของคุณ หรือต้องการแปลงคำสั่ง SQL เป็น Linq อื่น ๆ ยินดีให้คุณติดต่อในความคิดเห็นด้านล่าง สนุกกับการเขียนโค้ด!