join 子句(C# 参考)内部联接, 分组联接, 左外部联接

http://msdn.microsoft.com/zh-cn/library/Bb311040(v=vs.100).aspx?appId=Dev10IDEF1&l=EN-US&k=k(JOIN_CSHARPKEYWORD)%3bk(TargetFrameworkMoniker-%22.NETFRAMEWORK,VERSION%3dV4.0%22)%3bk(DevLang-CSHARP)&rd=true

 

       IList<Department> mDepartmentLst = new List<Department>();
            IList<Employee> mEmployeeLst = new List<Employee>();
            mDepartmentLst.Add(new Department() { Id = 1, DeptNo = "001", DeptName = "开发部", IsBusiness = false });
            mDepartmentLst.Add(new Department() { Id = 2, DeptNo = "002", DeptName = "B2C 商务部", IsBusiness = true });
            mDepartmentLst.Add(new Department() { Id = 3, DeptNo = "003", DeptName = "B2B 商务部", IsBusiness = true });
            mDepartmentLst.Add(new Department() { Id = 4, DeptNo = "004", DeptName = "人事部", IsBusiness = false });

            mEmployeeLst.Add(new Employee() { Id = 1, DeptId = 1, EmpNo = "NO001", EmpName = "xushengtao" });
            mEmployeeLst.Add(new Employee() { Id = 1, DeptId = 1, EmpNo = "NO002", EmpName = "fankaijian" });
            mEmployeeLst.Add(new Employee() { Id = 1, DeptId = 4, EmpNo = "NO003", EmpName = "wangguoqin" });

            /*
             分组联接会产生一个分层的结果序列,该序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。 分组联接没有等效的关系术语;它本质上是一个对象数组序列。
             如果在右侧源序列中找不到与左侧源中的元素相匹配的元素,则 join 子句会为该项产生一个空数组。 因此,分组联接基本上仍然是一种内部同等联接,区别只在于分组联接将结果序列组织
             为多个组。 如果您只选择分组联接的结果,则可以访问各个项,但无法识别结果所匹配的键。 因此,通常更为有用的做法是选择分组联接的结果并放入一个也具有该键名的新类型中.
             */
            var groupQuery = from m in mDepartmentLst
                             join n in mEmployeeLst on m.Id equals n.DeptId into mEmployeeGroup
                             select new { DeptName = m.DeptName, Employees = mEmployeeGroup };

            /*
             在左外部联接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。 若要在 LINQ 中执行左外部联接,请将 DefaultIfEmpty 方法与分组联接结合起来,
             * 以指定要在某个左侧元素不具有匹配元素时产生的默认右侧元素。 
             * 可以使用 null 作为任何引用类型的默认值,也可以指定用户定义的默认类型。 下面的示例演示了用户定义的默认类型:
             * 另:右联接的实现只需要将左外部联接中的 两个要关联的目标对象的位置相互对换一下就可以了。
             * */
            var leftJoinQuery = from m in mDepartmentLst(左对象)
                                join n in mEmployeeLst on m.Id equals n.DeptId into mEmployeeGroup
                                from p in mEmployeeGroup.DefaultIfEmpty(当右对象为空时)
                                select p;
posted @ 2012-10-15 15:56  xust  阅读(424)  评论(0)    收藏  举报