2014-09-29 2 views
1

일부 REST 경로에서 페이징되고 필터링 된 결과가 반환됩니다. 내 코드를 단순화하면, 이런 식입니다 :Entity Framework를 사용하여 하나의 쿼리를 선택하여 계산합니까?

var query = db.SomeTable.Where(row => row.SomeProperty > 42); 

return new Result { 
    data = query.Skip(skip ?? 0).Take(take ?? 25).ToList(), 
    count = query.Count() }; 

이 작동하지만 SQL Server 데이터베이스에 두 개의 쿼리 생성 : 그들을 계산하는 두 번째 데이터를 가져 오는 하나. 수작업으로 작성된 T-SQL 쿼리를 사용하지 않고 하나의 쿼리에서이 작업을 수행하는 방법은 무엇입니까?

+0

손으로 쓴 쿼리는 둘 다 데이터를 선택합니다 (수집되지 않음). (집계 된) 레코드의 수를 계산합니까? – Jamiec

+0

첫 번째 행의 끝에 "ToList()"를 실행할 수 있지만 처음에는 데이터베이스에서 SomeProperty> 42 인 모든 행을 가져옵니다. – Sasse

+0

두 개의 SQL 쿼리를 생성 할 방법이 없다는 것이 나에게 발생했습니다. 각 레코드의 수를 반환합니다. – reckface

답변

0

시도 :

var query = db.SomeTable.Where(row => row.SomeProperty > 42); 

return query.Select (q => new{q, Total = db.SomeTable.Count()}) 
    .Skip(skip ?? 0).Take(take ?? 25).ToList(); 

편집

이 나쁜! 결국 각 레코드의 수를 반환하지만, 이는 하나의 데이터베이스 히트를 사용하여 수행하려는 경우 수행하는 방법입니다.

+0

그게 다른 결과를 줄 것입니다! 이것으로 계산은 OP에서와 같이 전체 레코드 세트가 아닌'Take'n 레코드 일 것입니다. – Jamiec

+0

죄송합니다. 나는 그것을 고쳤다. 내 방식의 오류를보기 위해 linqPad를 통해 실행해야했습니다! 또한 한 번에 계산을 시도하는 것은 좋지 않습니다. 이것은 SQL 일간의 패턴을 전달하려고합니다. – reckface

관련 문제