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
GroupJoin: Ghép nhóm nhân viên theo DepartmentID với các phòng ban.SelectManykết hợpDefaultIfEmpty(): Làm phẳng kết quả, nếu nhóm phòng ban rỗng thì trả vềnull.- 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.