LINQ:Group Join

一、数据准备

复制代码
public class Employee
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int AddressId { get; set; }
        public int DepartmentId { get; set; }
        public static List<Employee> GetAllEmployees()
        {
            return new List<Employee>()
            {
               new Employee { ID = 1, Name = "张三", AddressId = 1,DepartmentId=10},
                new Employee { ID = 2, Name = "李四", AddressId =2,DepartmentId=20},
                new Employee { ID = 3, Name = "王五", AddressId = 0,DepartmentId=0},
                new Employee { ID = 4, Name = "钱六", AddressId = 0,DepartmentId=0},
                new Employee { ID = 5, Name = "郑七", AddressId = 5,DepartmentId=0},
                new Employee { ID = 6, Name = "苏八", AddressId = 6,DepartmentId=10}
            };
        }
    }
复制代码
复制代码
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 = 10, Name = "IT"},
                    new Department { ID = 20, Name = "HR"},
                    new Department { ID = 30, Name = "Sales"  },
                };
        }
    }
复制代码

二、Group Join

1.法一Query Syntax

复制代码
 var GroupJoinQS = from dept in Department.GetAllDepartments()
                              join emp in Employee.GetAllEmployees()
                              on dept.ID equals emp.DepartmentId
                              into EmployeeGroups
                              select new { dept, EmployeeGroups };

            //Outer Foreach is for all department
            foreach (var item in GroupJoinQS)
            {
                Console.WriteLine("Department :" + item.dept.Name);
                //Inner Foreach loop for each employee of a department
                foreach (var employee in item.EmployeeGroups)
                {
                    Console.WriteLine("  EmployeeID : " + employee.ID + " , Name : " + employee.Name);
                }
            }
复制代码

 

2.法二Method Syntax

复制代码
  var GroupJoinMethod = Department.GetAllDepartments()
             .GroupJoin(
             Employee.GetAllEmployees(),
             dept => dept.ID,
             emp => emp.DepartmentId,
             (dept, emp) => new { dept, emp }
             );
            foreach (var item in GroupJoinMethod)
            {
                Console.WriteLine("Department :" + item.dept.Name);
                //Inner Foreach loop for each employee of a department
                foreach (var employee in item.emp)
                {
                    Console.WriteLine("  EmployeeID : " + employee.ID + " , Name : " + employee.Name);
                }
            }
复制代码

 

 官方解释

        public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector);

 

 三、测试结果

 

 注意上面虽然Sales这个部门对应的Employee为空,但还是显示出来,而且发现,显示的结果是分组好的。(其实是LEFT JOIN,只是LEFT JOIN没有分组,可以这么理解吗?)

四、Group Join, Inner Join和Left Join之间的区别

1. 与上文的Inner Join对比?

 

 注意Inner Join是没分组的,所以foreach只有一层,而且inner join是不会显示出Sales这个部门,结果如下:

 

 2. 与下文Left Join对比?

 

 注意Left Join也是没分组的,所以foreach只有一层,会显示Sales这个部门,但一定一定要注意判断为空

 五、参考网址

https://dotnettutorials.net/lesson/linq-group-join/

posted @   katesharing  阅读(166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示