2014-09-29 3 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

Try:

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(); 

EDIT

Это плохо! Это приведет к возврату счета для каждой записи, но именно так вы бы это сделали, если бы захотели сделать это с одним удалением базы данных.

+0

Thats собирается дать другой результат! При этом счетчик будет содержать записи «Take'n», а не весь набор записей, как в OP. – Jamiec

+0

извините. Я исправил это. Пришлось запустить его через linqPad, чтобы увидеть ошибку моих путей! Кроме того, это не очень хорошая идея, пытаясь получить счет за один раз. Это пытается переносить шаблон из SQL-дней – reckface

Смежные вопросы