Получение COUNT и SKIP TAKE за одну операцию с помощью Linq to EntitiesC#

Место общения программистов C#
Ответить
Anonymous
 Получение COUNT и SKIP TAKE за одну операцию с помощью Linq to Entities

Сообщение Anonymous »

У меня есть вызов данных на уровне доступа к данным на базе Linq to Entities, который предназначен для выполнения пейджинговых вызовов.

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

В настоящее время я выполняю следующее:

Код: Выделить всё

var queryResult = DatabaseContext.Table
.Where(x => !x.IsDeleted)
.Where(p => (
p.PropertyOne.ToLower().Contains(query) ||
p.PropertyTwo.ToLower().Contains(query)
));

int count = queryResult.Count();

var returnData = queryResult
.OrderBy(i => i.ID)
.Skip(start).Take((length))
.Select(y => new ObjectDTO
{
PropertyOne = y.PropertyOne,
PropertyTwo = y.PropertyTwo
}
.AsEnumerable();
Это приводит к двум дорогостоящим операциям с базой данных. Операция COUNT по какой-то причине занимает больше времени, чем операция SELECT.

Есть ли способ получить количество и подмножество в одном и том же операцию?

Логическая последовательность действий подсказывает мне, что мы делаем следующее:
  • Просмотрите таблицу.
  • Найдите в таблице элементы, соответствующие условию.
  • Получите количество всех совпадений.
  • Вернуть пронумерованное подмножество совпадений
Кажется, это возможно за одну операцию, но я не могу понять, как это сделать.

Попытка первая, медленнее

Попробовал предложение Д. Стэнли о преобразовании полного набора результатов в список

code> и выполняет подсчет и память при подкачке, но это примерно в 2 раза медленнее (в среднем 6,9 с против 3,9 с в среднем)

Стоит отметить, что набор данных составляет примерно 25 000 записей. , с более чем дюжиной связанных таблиц, поиск по которым осуществляется посредством JOIN.

Подробнее здесь: https://stackoverflow.com/questions/292 ... o-entities
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»