2010-08-09 1 views
1

내 Entity Framework에 액세스하는 리포지토리가 있습니다. 다음과 같은 방법이 있습니다 :Func <T, bool>을 작성하여 대부분의 하위 항목이있는 항목을 반환하려면 어떻게해야합니까?

public TEntity FindOne(Expression<Func<TEntity, bool>> criteria) 
{ 
    var query = _queryAll.Where(criteria); 
    return query.FirstOrDefault(); 
} 

나는 1 대 다수 관계가있는 2 개의 엔티티가 있습니다. CoursesStudents으로 전화 할 수 있습니다. Course은 복수 Students 일 수 있습니다. 대부분의 학생들이있는 코스를 반환하는 쿼리를 작성하고 싶습니다.

Courses.OrderByDescending(x=>x.Students.Count()).FirstOrDefault(); 

하지만 어떻게 쓸 수 있습니까? Func<T, bool>?

나는 그것이 작동하지 않을 것 같은 다른 기준을 추가하는 것은 보이는 때문에이

(x=>x.OrderBy(y=>y.Students.Count()).FirstOrDefault().id == x.id) 

하지 희망 : 당신이 마지막에 && x.Course == "CS101"을 넣어 줄 이유

(x=>x.OrderBy(y=>y.Students.Count()) 
     .FirstOrDefault().id == x.id 
     && x.CourseName == "CS101") 

답변

2

그것은 전혀 분명하지 않다. 그게 의미하는 의미일까요? 모든 문제를 FindOne 메서드의 Where 절로 묶어 두려고하는 디자인에 문제가 있다고 생각합니다. 간단히 말해서 모든 것을 그렇게 쉽게 표현할 수있는 것은 아닙니다.

또한 OrderByDescending을 사용해야 첫 번째 결과는 이되며 가장 많이 사용되는 학생은입니다.

그 외의 경우 주문을 사용하는 것이 전체 쿼리 측면에서 나에게 상당히 합리적 인 것처럼 보일 수 있지만 귀하의 FindOne 구성표에는 깔끔하게 맞지 않습니다.

편집 : 이것은 두 가지 조건을 요구하는 것보다 큰 문제입니다. 당신은 작성할 수

x => x.CourseId == "CS101" && 
    x.Students.Count() == Courses.Where(x => x.CourseId == "CS101")) 
            .Max(x => x.Students.Count()) 

을 ...하지만 문제는 그 시점에서 당신은 당신이 떨어져 얻기 위해 노력하고 상상하는 것, 이는 어쨌든 Courses에 액세스 할 수있어 것입니다. 그 외에는 이 작동해야합니다.하지만 그로테스크합니다.

당신이 과정에 액세스 할 수 있습니다, 당신은뿐만 아니라 FindOne을 무시하고 쿼리를 직접 작성할 수 있습니다 경우 : 분명히 첫 번째 버전보다 간단

var course = courses.Where(course => course.CourseId == "CS101") 
        .OrderByDescending(course => course.Students.Count()) 
        .FirstOrDefault(); 

합니다.

+0

orderby 버그에 대한 고마움 - 수정 됨. 나는 내가 두 번째 기준을 추가하는 방법을 잘 모를 것이라고 생각한다. 내 재산 이름 "코스"가 혼란스럽고 나는 그것을 읽지 않았다고 생각합니다. – itchi

+0

고마워 .. 그로테스크를 찾고 있었기 때문에 나는 여기에왔다. 나는 이것이 내 저장소 (IQueryable을 노출시키지 않는 것)가 무엇보다 실패한 것 같다고 생각한다. 아마도 FindTopOne (Expression > criteria, Expression > 정렬)을 추가 할 수 있습니다. – itchi