Computer >> Máy Tính >  >> Lập trình >> C#

Làm thế nào để thực hiện một phép nối bên ngoài bên trái bằng cách sử dụng các phương thức mở rộng linq trong C #?

Với INNER JOIN chỉ các phần tử phù hợp mới được đưa vào tập kết quả. Các phần tử không phù hợp bị loại trừ khỏi tập kết quả.

Với THAM GIA BÊN NGOÀI TRÁI tất cả các phần tử phù hợp + tất cả các phần tử không khớp từ tập hợp bên trái được đưa vào tập kết quả.

Hãy để chúng tôi hiểu việc triển khai Left Outer Join bằng một ví dụ. Hãy xem xét Phòng ban và các lớp Nhân viên sau đây. Lưu ý rằng, Employee Mary không có một bộ phận được chỉ định. Một phép tham gia bên trong sẽ không bao gồm bản ghi của cô ấy trong tập kết quả, trong khi một phép kết hợp Bên ngoài bên trái sẽ có.

Ví dụ

static class Program{
   static void Main(string[] args){
      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);
      }
   }
}
public class Department{
   public int ID { get; set; }
   public string Name { get; set; }
   public static List<Department> GetAllDepartments(){
      return new List<Department>(){
         new Department { ID = 1, Name = "IT"},
         new Department { ID = 2, Name = "HR"},
      };
   }
}
public class Employee{
   public int ID { get; set; }
   public string Name { get; set; }
   public int DepartmentID { get; set; }
   public static List<Employee> GetAllEmployees(){
      return new List<Employee>(){
         new Employee { ID = 1, Name = "Mark", DepartmentID = 1 },
         new Employee { ID = 2, Name = "Steve", DepartmentID = 2 },
         new Employee { ID = 3, Name = "Ben", DepartmentID = 1 },
         new Employee { ID = 4, Name = "Philip", DepartmentID = 1 },
         new Employee { ID = 5, Name = "Mary" }
      };
   }
}