LINQ Left Outer Join

LINQ Left Outer Join

في هذا الدرس، هنتعلّم إزاي ننفّذ Left Outer Join باستخدام LINQ في C#، سواء بـ Query Syntax أو Method Syntax.



ما هو Left Outer Join؟

بيرجع كل العناصر من المجموعة اليسرى (زي الأقسام)، سواء وُجد لها عنصر مطابق في المجموعة اليمنى (زي الموظفين) أو لأ. ولو مفيش، بيرجع null.



تعريف الكائنات:


public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int DepartmentID { get; set; }
}

public class Department
{
    public int ID { get; set; }
    public string DeptName { get; set; }
}


البيانات:


List<Employee> employees = new List<Employee>()
{
    new Employee() { ID = 1, Name = "John", DepartmentID = 1 },
    new Employee() { ID = 2, Name = "Moin", DepartmentID = 1 },
    new Employee() { ID = 3, Name = "Bill", DepartmentID = 2 },
    new Employee() { ID = 4, Name = "Ram", DepartmentID = 2 },
    new Employee() { ID = 5, Name = "Ron", DepartmentID = 3 }
};

List<Department> departments = new List<Department>()
{
    new Department(){ ID = 1, DeptName = "IT"},
    new Department(){ ID = 2, DeptName = "HR"},
    new Department(){ ID = 3, DeptName = "Finance"},
    new Department(){ ID = 4, DeptName = "Admin"}
};


Left Outer Join باستخدام Query Syntax:


var leftOuterJoin = from dept in departments
                    join emp in employees
                    on dept.ID equals emp.DepartmentID into empGroup
                    from emp in empGroup.DefaultIfEmpty()
                    select new
                    {
                        Department = dept.DeptName,
                        Employee = emp != null ? emp.Name : "No Employee"
                    };


Left Outer Join باستخدام Method Syntax:


var leftOuterJoin = departments
    .GroupJoin(employees,
               dept => dept.ID,
               emp => emp.DepartmentID,
               (dept, empGroup) => new { dept, empGroup })
    .SelectMany(
        x => x.empGroup.DefaultIfEmpty(),
        (x, emp) => new
        {
            Department = x.dept.DeptName,
            Employee = emp != null ? emp.Name : "No Employee"
        });


الناتج:


Department: IT, Employee: John  
Department: IT, Employee: Moin  
Department: HR, Employee: Bill  
Department: HR, Employee: Ram  
Department: Finance, Employee: Ron  
Department: Admin, Employee: No Employee


ملاحظات:

  • GroupJoin + DefaultIfEmpty() هما الأساس لتنفيذ Left Join في LINQ.
  • تقدر تغير "No Employee" لأي قيمة افتراضية تناسب مشروعك.
  • النتيجة دايمًا بترجع كل عناصر القسم، حتى لو مفيش موظفين فيه.


تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework