Ducky Coder
Published on

EF Core 10 มี Left Join แล้ว!

 
EF Core 10 มี Left Join แล้ว!

LEFT JOIN เรียกได้ว่าเป็นเรื่องปกติในการ query ข้อมูลแต่กลับไม่เคยมีใน EF เลย ตั้งเริ่มจนปัจจุบัน แต่ใน EF Core 10 ได้ใส่ LeftJoin มาให้แล้ว!!! (นานไปมั้ย) ซึ่งแต่ก่อนเวลาที่ต้ต้องเขียน LEFT JOIN ต้องใช้ GroupJoin, SelectMany และ DefaultIfEmpty ทำให้การเขียนและอ่านยากมาก

LINQ มีประโยชน์ยังไง มาดู - 10 LINQ ที่นักพัฒนา C# ทุกคนต้องรู้

ก่อนหน้าที่จะมี LeftJoin ใน EF Core 10 การเขียน LEFT JOIN ใน LINQ ต้องใช้เทคนิคหลายขั้นตอนร่วมกัน ซึ่งมักทำให้โค้ดยาวและอ่านยาก

var query = students
    .GroupJoin(
        departments,
        student => student.DepartmentID,
        department => department.ID,
        (student, departmentList) => new { student, subgroup = departmentList })
    .SelectMany(
        joinedSet => joinedSet.subgroup.DefaultIfEmpty(),
        (student, department) => new
        {
            student.student.FirstName,
            student.student.LastName,
            Department = department != null ? department.Name : "[NONE]"
        });

ในตัวอย่างนี้ เราต้อง:

  • ใช้ GroupJoin เพื่อจับคู่ข้อมูลจากตาราง students กับ departments
  • จากนั้นใช้ SelectMany กับ DefaultIfEmpty เพื่อจัดการกับข้อมูลที่ไม่มีคู่ตรงกัน (ซึ่งเป็นลักษณะของ LEFT JOIN)

การเขียนในลักษณะนี้ทำให้เกิดโค้ดที่ซับซ้อน

LeftJoin ใน EF Core 10 สามารถเขียน LEFT JOIN ใน LINQ ได้ง่ายขึ้นและตรงไปตรงมา เพียงแค่ใช้เมธอด LeftJoin แล้วระบุ key selector และผลลัพธ์ที่ต้องการ

var query = students
    .LeftJoin(
        departments,
        student => student.DepartmentID,
        department => department.ID,
        (student, department) => new
        {
            student.FirstName,
            student.LastName,
            Department = department?.Name ?? "[NONE]"
        });

✨ข้อดีของการใช้ LeftJoin

  • อ่านง่ายขึ้น: โค้ดดูสั้นและเข้าใจง่าย ไม่ต้องใช้หลายเมธอดพร้อมกัน
  • ลดความซับซ้อน: โค้ดที่ได้มีความกระชับ ทำให้ดูแลและแก้ไขได้ง่ายในอนาคต
  • รองรับใน EF Core: EF Core สามารถรู้จักและแปลความหมายของ LeftJoin ได้อย่างถูกต้อง โดยที่ไม่ต้องเขียน LEFT JOIN ในรูปแบบ SQL

เขียนโค้ดให้สนุกนะครับ 😊