Вопрос по c#, entity-framework – C # Entity Framework Pagination

11

Есть ли способ получить количество строк сложного запроса Linq и миллионы записейwithout ударяя по БД дважды или написав 2 отдельных запроса ??

Я мог бы иметь свое собственное предложение. Напишите хранимую процедуру, но я хорошо справляюсь с MySQL, а не с MSSQL.

Любые лучшие предложения будут отличными. Кроме того, если кто-нибудь знает, работает ли Microsoft над добавлением этой функции в структуру сущностей.

Спасибо @JonathanWood за ваши мысли! Jason Foglia
@JKselect count() совсем не дешево! На самом деле он имеет почти ту же сложность, что и фактическая выборка данных, с той лишь разницей, что вместо выборки строк он только считает их. Но все равно придется выполнять все сканы и т. Д. Vladimir Perevalov
Если у меня сложный запрос, который просто подсчитывает результаты, которые могут быть более 10000, другой, который просто захватил бы 20 из этих результатов. Будет ли Count () облагать налогом весь процесс? Jason Foglia
Когда вы используете .Count () в EF, он не выбирает все строки, он только выполняетselect count() from table SQL заявление - так что, хотя вам нужно 2 запроса, один из них очень дешево. JK.
Я совершенно уверен, что вы не можете получить количество строк в вашем запросе, не попав в базу данных или написав запрос, отдельный от того, который фактически возвращает эти строки. Jonathan Wood

Ваш Ответ

3   ответа
2

страницы. Подумайте об этом: если у вас миллионы записей, скажем, 20 или даже 100 элементов на странице, то у вас будет десятки тысяч страниц. Не имеет смысла показывать их всех. Вы можете просто загрузить текущую страницу и предоставить ссылку на следующую страницу, вот и все. Или вы можете загрузить, скажем, 100-500 записей, но по-прежнему показывать только одну страницу и использовать информацию о загруженных записях для создания ссылок на страницы для первых нескольких страниц (так что точно знайте, сколько следующих страниц доступно).

@Jonathan Wood, например, посмотрите на результаты поисковых систем. Они показывают только ~ 10 страниц. Иapproximate количество итоговых результатов (но это совсем другой вопрос).
Вы также можете указать текстовое поле & quot; Перейти к: & quot; и кнопка для прямого перехода на определенную страницу.
На самом деле, довольно часто показывают какие-то элементы управления пейджером, которые указывают общее количество страниц / элементов.
Вы правы, я бы не хотел показывать сотни или тысячи ссылок или даже заставлять кого-то проходить через это множество страниц. Полагаю, проблема в том, что я хочу написать только один запрос. Например: MySQL позволил вам использовать SQL_CALC_FOUND_ROWS в запросе, а затем другой запрос, чтобы получить только этот результат. Очень эффективный!!! Сделана нумерация страниц Спасибо @VladimirPerevalov за ваши мысли! Jason Foglia
AFAIK нет такой поддержки ни в LINQ, ни в MS SQL Server. На самом деле MySql делает много вещей, а MS SQL - нет. Например.SELECT BETWEEN ... также очень эффективен для нумерации страниц.
9

для указания количества записей, взятых из запроса linq или List. Например

List<customers> _customers = (from a in db.customers select a).ToList();
var _dataToWebPage = _customers.Take(50);

Я использую подобную технику в приложении MVC, где я записываю список _customers в сеанс, а затем использую этот список для дальнейших запросов разбивки на страницы, когда пользователь нажимает на страницу 2, 3 и т. Д. Это сохраняет несколько обращений к базе данных. Однако, если ваш список очень большой, то и его запись, вероятно, не очень хорошая идея.

Для нумерации страниц вы можете использовать функции Skip () и Take () вместе. Например, чтобы получить страницу 2 данных:

var _dataToWebPage = _customers.Skip(50).Take(50);
Спасибо @TimNewton. Конечно, но если у меня есть миллион записей или, что еще лучше, тысяча записей с очень большими столбцами данных, вы столкнетесь с исключением из-за нехватки памяти. Jason Foglia
Джейсон, не могли бы вы записать первичные ключи в список в сеансе, а не во весь объект, а затем извлекать подробности из базы данных каждый раз, когда вам нужно повторно отобразить данные, используя первичные ключи из списка? Это все еще требует многократных чтений базы данных все же. Я не думаю, что вы можете обойтись без нескольких чтений БД, если ваш набор данных настолько велик.
Вы можете быть правы в том, что не можете сделать один db для чтения этого экземпляра в c # и использовать Linq. Я знаю, что это можно сделать, просто мне нужна возможность использовать Linq для того, чтобы он строго печатался и соответствовал остальной части моего чистого кода. У меня отлично работает пагинация для небольших таблиц, в которых нет больших наборов данных или больших данных. Jason Foglia
призваниеToList() доTake(50) означает, что вы вставляете каждую запись в свое приложение. И затем, после того, как сервер сделал всю эту работу, вы игнорируете все, кроме 50. ЗвонитеTake(50) доToList()
2

Вы можете написать этот запрос:

select count() over(), table.* from table

count () over () вернет количество итоговых строк в результате, поэтому вам не нужно запускать два запроса. Помните, что вы должны запустить raw sql в вашем контексте или использовать dapper, который возвращает результат в качестве модели представления

Похожие вопросы