2014-09-25 3 views
1

나는 linq 쿼리 내에서 하위 컬렉션을 얻는 방법을 알아 내려고하고있어. 기본적으로 여러 개의 일정이있는 코스가 있지만 아래 쿼리를 사용하면 일정이 컬렉션이 아니기 때문에 각 코스마다 여러 개의 개체가 반환됩니다.조인과 자식 컬렉션을 반환하는 방법 linq 쿼리

public JsonResult Required(int programId, int departmentId) 
{ 
     var courses = (from r in context.ProgramRequiredCourses 
         join c in context.IAUClasses on r.ClassId equals c.id 
         join s in context.IAUClassSchedules on c.id equals s.classId 
         join d in context.IAUDepartments on c.mainDepartmentId equals d.id       
         where r.ProgramId == programId && d.id == departmentId 
         select new RequiredCourse{ 
          Department = d, 
          Course = c, 
          Schedule = s 
         }).AsEnumerable().Distinct(new DistinctCourseComparer()); 
     return Json(courses, JsonRequestBehavior.AllowGet); 
    } 

** 지원 코드 **

나는 RequiredCourse 클래스의 일정이 IEnumerable을 변경해야합니다 알고 있지만, 그것을 채우기에 대해 이동하는 방법을 잘. 당신이 그룹에 대해 묻는있는 것 같습니다

public class RequiredCourse 
{ 
    public IAUClass Course { get; set; } 
    public IAUClassSchedule Schedule { get; set; } 
    public IAUDepartment Department { get; set; } 
} 

public class DistinctCourseComparer : IEqualityComparer<RequiredCourse> 
{ 
    public bool Equals(RequiredCourse x, RequiredCourse y) 
    {    
     return x.Course.id == y.Course.id && 
       x.Course.className == y.Course.className; 
    } 

    public int GetHashCode(RequiredCourse obj) 
    { 
     return obj.Course.id.GetHashCode()^
       obj.Course.className.GetHashCode(); 
    } 
} 
+0

쿼리는 여러 개의 고유 한 RequiredCourse를 반환합니다. 그래서 기본적으로 여러 개의 다른 스케줄을 리턴하려고합니다. – Hatjhie

+0

아니요 각각 일정표가있는 여러 개의 별개 과목이 필요합니다. 말이된다? RequiredCourse는 각 코스의 결과를 보관하는 객체 일 뿐이므로 각 코스의 코스 객체, 부서 객체 및 일정 객체 컬렉션이 있어야합니다. –

답변

2

가입 :

from r in context.ProgramRequiredCourses 
join c in context.IAUClasses on r.ClassId equals c.id 
join s in context.IAUClassSchedules on c.id equals s.classId into classSchedules 
join d in context.IAUDepartments on c.mainDepartmentId equals d.id 
where r.ProgramId == programId && d.id == departmentId 
select new 
{ 
    Department = d, 
    Course = c, 
    Schedules = classSchedules 
} 

쿼리의 into classSchedules 부분의 특별한 기록해 둡니다. 각 일정에 대해 새 행을 출력하는 대신 클래스별로 모든 일정을 함께 그룹화합니다. IEnumerable<IAUClassSchedule>classSchedules

관련 문제