🚀 Kosol.net

Published

- 3 min read

SQL Query vs Entity Framework Syntax

img of SQL Query vs Entity Framework Syntax

เรามาเปรียบเทียบคำสั่ง SQL Query กับ Entity Framework Syntax (สำหรับคนที่ถนัด Query แต่เพิ่งเริ่มศึกษา Entity Framework) ว่าถ้าต้องการใช้ Query ประมาณนี้จะต้องเขียนยังไง

การดึงข้อมูลแบบง่าย

ตัวอย่างแรก ถ้าต้องการดึงข้อมูลจาก Table Employee โดยเอารหัสพนักงาน กับ ชื่อพนักงาน โดยกรองเฉพาะข้อมูลที่ไม่ถูกลบ และเรียงลำดับตามรหัสพนักงานจะต้องทำอย่างไร

   SELECT TOP 10 EmpCode, EmpName
FROM Employee
WHERE IsDeleted=0
ORDER BY EmpCode

รูปแบบแรก จะเป็นการเขียนแบบ EF Syntax

   var result = context.Employee
       .Where(e => e.IsDeleted == 0)
       .OrderBy(e => e.EmpCode)
       .Select(e => new { e.EmpCode, e.EmpName })
       .Take(10)
       .ToList();

รูปแบบที่สอง เป็นการเขียนแบบ LINQ Syntax

   var result = (from e in context.Employee
              where e.IsDeleted == 0
              orderby e.EmpCode
              select new
              {
                  e.EmpCode,
                  e.EmpName
              }).Take(10);

การ JOIN

ต่อมาถ้าจะ Join Table แผนก (Division) โดยใช้ DivisionID เป็นคีย์ในการเชื่อมข้อมูลเพื่อไปดึงรหัสแผนกและชื่อแผนก จะต้องทำยังไง

   SELECT e.EmpCode, e.EmpName, d.DivisionCode, d.DivisionName
FROM Employee e
JOIN Division d on e.DivisionID = d.DivisionID
WHERE IsDeleted=0
ORDER BY EmpCode

รูปแบบแรก จะใช้คำสั่ง Join ในการเชื่อมข้อมูล ดังนี้

   var result = context.Employee
       .Join(context.Division,
             e => e.DivisionID,
             d => d.DivisionID,
             (e, d) => new { e.EmpCode, e.EmpName, d.DivisionCode, d.DivisionName })
       .Where(ed => ed.IsDeleted == 0)
       .OrderBy(ed => ed.EmpCode)
       .ToList();

รูปแบบ LINQ จะใช้คำสั่ง join … in … on col1 eq col2

   var result = from e in context.Employee
             join d in context.Division on e.DivisionID equals d.DivisionID
             where e.IsDeleted == 0
             orderby e.EmpCode
             select new
             {
                 e.EmpCode,
                 e.EmpName,
                 d.DivisionCode,
                 d.DivisionName
             };

การ LEFT JOIN

แล้วถ้าจะใช้แบบ LEFT JOIN หล่ะ จะต้องทำยังไง

   SELECT e.EmpCode, e.EmpName, d.DivisionCode, d.DivisionName
FROM Employee e
LEFT JOIN Division d on e.DivisionID = d.DivisionID
WHERE IsDeleted=0
ORDER BY EmpCode

— แบบแรก จะใช้เงื่อนไขประมาณนี้ (keycol != null ? valuecol : null)

   var result = context.Employee
       .Where(e => e.IsDeleted == 0)
       .OrderBy(e => e.EmpCode)
       .Select(e => new {
            e.EmpCode,
            e.EmpName,
            DivisionCode = (e.Division != null ? e.Division.DivisionCode : null),
            DivisionName = (e.Division != null ? e.Division.DivisionName : null)
        })
        .ToList();

ส่วนของ LINQ จะเพิ่ม DefaultIfEmpty() เพิ่มเข้ามา

   var result = (from e in context.Employee
              where e.IsDeleted == 0
              orderby e.EmpCode
              join d in context.Division on e.DivisionID equals d.DivisionID into divisions
              from d in divisions.DefaultIfEmpty()
              select new
              {
                  e.EmpCode,
                  e.EmpName,
                  DivisionCode = (d != null ? d.DivisionCode : null),
                  DivisionName = (d != null ? d.DivisionName : null)
              }).ToList();

การใช้ GROUP BY ร่วมกับ COUNT

แล้วถ้าจะทำ Group By หล่ะ

   SELECT DivisionCode, DivisionName, COUNT(EmpCode) EmpCount
FROM Division d
LEFT JOIN Employee e ON d.DivisionID=e.DivisionID
WHERE d.IsDeleted=0 AND e.IsDeleted=0
GROUP BY DivisionCode, DivisionName
ORDER BY DivisionCode

แบบแรกจะใช้รูปแบบประมาณนี้ GroupJoin(...(tb1, tb2) => new {col1, col2})

   var result = context.Division
    .Where(d => d.IsDeleted == 0)
    .GroupJoin(context.Employee
        .Where(e => e.IsDeleted == 0),
        d => d.DivisionID,
        e => e.DivisionID,
        (division, employees) => new
        {
            division.DivisionCode,
            division.DivisionName,
            EmpCount = employees.Count()
        })
    .OrderBy(result => result.DivisionCode)
    .ToList();

ส่วนแบบ LINQ จะใช้คำสั่งประมาณนี้ group x by new { x.col1, x.col2 } into newx select new { col1, col2 }

   var result = (from d in context.Division
    where d.IsDeleted == 0
    join e in context.Employee
    on d.DivisionID equals e.DivisionID into empGroup
    from emp in empGroup.DefaultIfEmpty()
    where emp.IsDeleted == 0 || emp == null
    group d by new { d.DivisionCode, d.DivisionName } into grouped
    orderby grouped.Key.DivisionCode
    select new
    {
        grouped.Key.DivisionCode,
        grouped.Key.DivisionName,
        EmpCount = grouped.Count()
    })
.ToList();

หวังว่าบทความนี้จะเป็นประโยชน์กับใครที่กำลังเริ่มศึกษา EF แล้วไม่รู้ว่าจะเริ่มยังไงนะครับ