2017-02-11 1 views
0

나는 각 그룹의 첫 번째 레코드 선택이 LINQ 쿼리가 충족되는 경우에만 각 그룹의 첫 번째 레코드 :LINQ, 조건이

repo.GroupBy(x => x.Revision, (key, g) => g.OrderBy(y => y.CreationDate).First()) 

가 지금은 각 그룹에만 경우의 첫 번째 레코드를 선택합니다을 이 개체를 반환하고 내가 각각의 모든 첫 번째 레코드를 가져하지 않고 내 데이터베이스의 상태를 점검 할 수 있도록하려는 때문에 분명히

!x.Terminated 

내가 내 GROUPBY에 어디를 추가 할 수 없습니다 : 기록은 조건을 만족 그룹화하고 거기에서 작동하십시오.

** 편집

내 디자인에 같은 개정을 공유 레코드 그룹은 같은 레지스터하지만 여러 번 편집 것을 의미한다. 이 방법으로 최근 생성 날짜가있는 레코드는 실제 개정 또는 레지스터 버전이며 그룹의 나머지 레코드는 기록입니다. 내 문제는 그룹의 실제 리비전 만 종료로 표시했기 때문에 그룹화하기 전에 종료 된 기능으로 필터링 할 수 없기 때문에 각 그룹을 생성 날짜별로 정렬하고 첫 번째 레코드 만 선택하는 것이 불가능하다는 것이 었습니다.

이제는 문제를 해결하기 위해 그룹을 만들기 전에 종료 된 레코드를 필터링하여 날짜별로 정렬하고 각 그룹의 첫 번째 레코드를 선택할 수 있도록 레지스터를 종료 할 때마다 전체 그룹을 종료로 표시 할 것입니다. @Jon Skeet과 @Thomas Andre Lian이 제안한 것처럼.

잠시 동안 대답을하지 않고 질문을 할 수 있습니다. 누군가가 그룹화, 정렬 및 각 그룹의 첫 번째 레코드를 선택한 후 종료 된 기능으로 필터링 할 수있는 다른 것을 제안 할 수 있습니다.

+3

종료 된 레코드를 완전히 제외시킬 것인지 여부는 확실하지 않습니다. 그렇다면 단순히 'repo.Where (x =>! x.Terminated) .GroupBy (...)'를 사용하지 않는 것이 좋습니다. –

+0

'GroupBy' 다음에'Where' *를 추가하지 않을 이유를 설명해 주시겠습니까? 감사합니다 –

+0

@ user1892538 컴파일러에서 다음 오류를 제공합니다. 'System.Linq.IQueryable '에 "Where"및 최상의 확장 메서드 오버로드에 대한 정의가 없습니다. 'System.Linq.Enumerable.Where (System.Collection.Generic .IEnumerable , System.Func ) '에 잘못된 인수가 있습니다. –

답변

1

IQueryable<T>을 리턴하는 Linq 메소드는 느리게 평가되고 구체화되지 않습니다.

즉, where 조건을 실제로 추가 할 수 있고 앞에이 오기 전에 (DB 공급자가) 전체 식 트리가 업데이트됩니다.

당신은 실행 흐름의 중요한 부분을 놓치고 : 생성 된 DB 명령은이 컬렉션을 열거 때 DB 에서 검색됩니다.

Linq에서 Group을 연결 한 후 Where을 연결한다고해서 메모리 내부 필터링이 발생하지 않고 정확히 HAVING 절에 나와 있습니다.

유창 버전은

repo.GroupBy(x => x.Revision) 
.Select(x => x 
    .OrderBy(y => y.CreationDate) 
    .First()) 
.Where(x => !x.Terminated) 

로 단순화 할 수 또는 쿼리 버전은 SQL에 위의 쿼리를 번역 할 수있는 경우는 DB 공급자에 의존 물론

var query = from rp in repo 
group rp by rp.Revision into grouped 
where !grouped.OrderBy(y => y.CreationDate).First().Terminated 
select grouped.OrderBy(y => y.CreationDate).First(); 

해야한다 클래스 매핑을 통해 : 그것은 실제로 어려울 수 있습니다.

+0

유창한 버전을 수정 (먼저 살펴보기)하고 쿼리 버전을 추가했습니다 (이전 버전이 실패한 경우). –

+0

유창한 버전은 잘 작동하며 정확히 내가 추구 한 것입니다. 고맙습니다. –

0

나는 이것이 트릭을 할 것이라고 생각한다.

repo.Where(x => !x.Terminated) 
     .GroupBy(x => x.Revision, (key, g) => g.OrderBy(y => y.CreationDate).First()) 

난 당신이 (물론 처음에 그것을 할 수있는) 어쨌든 모든 Terminated 요소를 제거 할 알고있는 것처럼

.