/// <summary> /// 지정된 부서에 소속된 직원들을 반환합니다. /// </summary> /// <param name="department">부서</param> /// <param name="hierarchyContainsKind">부서의 조상/자손도 포함할 것인가 여부</param> /// <returns>부서 소속원 컬렉션을 반환한다.</returns> public IList<User> FindAllUserByDepartment(Department department, HierarchyContainsKinds hierarchyContainsKind) { department.ShouldNotBeNull("department"); if(IsDebugEnabled) log.Debug(@"부서 소속 사원 정보를 가져옵니다. 부서의 상위 또는 하위 부서의 소속원들도 포함시킬 수 있습니다... " + @"department={0}, hierarchyContainsKind={1}", department, hierarchyContainsKind); // 중복 사용자를 피하기 위해 HashedSet을 사용합니다. var users = new HashSet<User>(); // 1. 조상부서에 소속된 직원 정보) if((hierarchyContainsKind & HierarchyContainsKinds.Ancestors) > 0) department.GetAncestors().RunEach(dept => dept.GetUsers().RunEach(u => users.Add(u))); // 2. 현재부서에 소속된 직원 정보 if((hierarchyContainsKind & HierarchyContainsKinds.Self) > 0) department.GetUsers().RunEach(u => users.Add(u)); // 3. 자손부서에 소속된 직원 정보) if((hierarchyContainsKind & HierarchyContainsKinds.Descendents) > 0) department.GetDescendents().RunEach(dept => dept.GetUsers().RunEach(u => users.Add(u))); return users.ToList(); }
/// <summary> /// 지정된 부서와 옵션에 따라 하위 부서 또는 상위부서를 포함한 부서정보를 제공합니다. /// </summary> /// <param name="department">조회할 기준 부서</param> /// <param name="hierarchyContainsKind">부서의 조상/자손도 포함할 것인가 여부</param> /// <returns></returns> public IList<Department> FindAllDepartmentByHierarchy(Department department, HierarchyContainsKinds hierarchyContainsKind) { // NOTE: 현재는 Loop 방식을 사용하여 round-trip이 많이 발생하게끔 되어 있다. Second Cache로 속도를 극복할 수 밖에 없다. if(IsDebugEnabled) log.Debug(@"계층구조에 따른 부서 정보를 조회합니다. department={0}, hierarchyContainsKind={1}", department, hierarchyContainsKind); var results = new List<Department>(); if(department == null) return results; // 1. 조상 부서 조회 및 추가 if((hierarchyContainsKind & HierarchyContainsKinds.Ancestors) > 0) results.AddRange(department.GetAncestors()); // 2. 현재 부서 추가 if((hierarchyContainsKind & HierarchyContainsKinds.Self) > 0) results.Add(department); // 3. 자손 부서 조회 및 추가 if((hierarchyContainsKind & HierarchyContainsKinds.Descendents) > 0) results.AddRange(department.GetDescendents()); return results; }