Linq: возврат результатов подсчета для большого набора данных - PullRequest
1 голос
/ 12 ноября 2011

У меня есть IEnumerable, который является результатом запроса к базе данных с большим набором данных, целых 10000 записей.Мне нужно, чтобы количество отображалось на веб-странице для нумерации страниц.Как я могу это сделать, использование .Count() приведет к исключениям, таким как 1: базовый поставщик потерпел неудачу в Open` или занимает слишком много времени.

Есть ли способ запросить базу данных, чтобы получить счетчик результатов для linq-SQL

Ответы [ 3 ]

3 голосов
/ 12 ноября 2011

Возможно, вы используете LINQ.если вы вызываете запрос следующим образом:

var users = (from u in context.Users select u);
int userCount = users.Count();

Это фактически вызовет запрос только для возврата отсчета из базы данных.Если вы сделали что-то вроде этого:

List<User> users = (from u in context.Users select u).ToList();
int userCount = users.Count();

Это вызовет и извлечет записи из базы данных, а затем попытается их подсчитать.

2 голосов
/ 12 ноября 2011

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

0 голосов
/ 12 ноября 2011

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

Другим способом было бы получить страницу 1, а затем получить остатки в пакетах в другом потоке, когда это завершит обновление счетчика и отображения, вы можете даже иметь счетчик выполнения, чтобы указать прогресс в получении всех данных.

Почему вы получаете все записи одновременно?

Если вы рассматриваете это как получение первой, последней, предыдущей и следующей страницы. А затем, если вы решите проблемы, возникающие в результате такого подхода, у вас будет масштабируемое решение.

Причина, по которой подсчет занимает так много времени, заключается в том, что ему приходится всасывать все 10000 записей в клиент для их подсчета. Это решение, которое очень плохо масштабируется, представьте 100 000 или миллион! Другой момент - латентность. Те 100 000 во время выполнения запроса, обновление не будет популярным, не так ли? Затем, когда вы обновите страницу, у вас появятся все страницы, на которых вы находились ...

Если вы переработали его, чтобы получить следующие n записей после последней, отображаемой в данный момент, или до первой ... Затем вы можете кешировать, вы можете обновить страницы в фоновом режиме, вы можете попытаться предсказать запрос, скажем, получить следующие n страниц заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...