Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Thực hiện Left Outer Join bằng LINQ Extension Methods trong C#

INNER JOIN chỉ trả về các phần tử khớp nhau từ hai tập hợp. Các phần tử không khớp bị loại bỏ.

LEFT OUTER JOIN trả về tất cả phần tử từ tập hợp bên trái (left) và các phần tử khớp từ tập hợp bên phải. Nếu không khớp, cột bên phải sẽ là null (hoặc giá trị mặc định).

Ví dụ minh họa

Giả sử có lớp Department và Employee. Nhân viên Mary chưa được gán phòng ban. Inner join sẽ loại bỏ Mary, còn Left Outer Join sẽ giữ lại với tên phòng ban là "No Department".

var result = Employee.GetAllEmployees()
    .GroupJoin(Department.GetAllDepartments(),
        e => e.DepartmentID,
        d => d.ID,
        (emp, depts) => new { emp, depts })
    .SelectMany(z => z.depts.DefaultIfEmpty(),
        (a, b) => new
        {
            EmployeeName = a.emp.Name,
            DepartmentName = b == null ? "No Department" : b.Name
        });

foreach (var v in result)
{
    Console.WriteLine($"{v.EmployeeName}\t{v.DepartmentName}");
}

Giải thích các bước

  1. GroupJoin: Ghép nhóm nhân viên theo DepartmentID với các phòng ban.
  2. SelectMany kết hợp DefaultIfEmpty(): Làm phẳng kết quả, nếu nhóm phòng ban rỗng thì trả về null.
  3. Sử dụng toán tử điều kiện b == null ? ... để gán tên mặc định.

Kết quả mong đợi

Mark    IT
Steve   HR
Ben     IT
Philip  IT
Mary    No Department

Lưu ý: Cách này mô phỏng LEFT JOIN trong SQL. Từ C# 7.0+, có thể dùng join ... into trong query syntax để dễ đọc hơn.