Большой запрос, как вернуть результаты в разделы С#/ASP.NET MVC 4

У меня есть приложение, написанное в ASP.NET MVC 4. У меня есть требование вернуть большие результаты из таблицы, доступной с помощью oledbdatareader.

Я использую AJAX для возврата объекта JsonResult, который содержит List: List<TableRow>

Я не понимаю, если я в цикле DataReader

using (OleDbDataReader reader = command.ExecuteReader())
{
   while (reader.Read())
   {
       names.Add(Convert.ToString(reader[0]));
   }
}

Есть ли способ периодически отправлять объект списка, а затем создавать новый объект для записи и продолжить?

Ответ 1

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

Я бы перевернул то, что вы делаете на его голове, и у вас есть фрагменты запроса javascript набора данных в партиях из 1000 (или любого другого размера) и начните рендеринг при запросе следующего фрагмента.

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

Ответ 2

Я думаю, у вас есть несколько вариантов, которые довольно распространены для реализации. Если у вас есть 10 000 записей, которые вам нужно вернуть клиенту, вы можете управлять этим в своем приложении MVC. Если вы используете Entity Framework и Linq, вы можете написать свою бизнес-логику, чтобы просто отправлять 100 строк в каждый раз, когда пользователь нажимает следующую кнопку. Это приведет к тому, что передача на клиент будет небольшой и даже не приведет к тому, что вызов с веб-сервера на сервер SQL будет небольшим.

Если вы не хотите, чтобы пользователь нажимал следующую кнопку (т.е. подкачку), но хотел бы сделать с бесконечным стилем прокрутки, тогда просто делайте то же самое, как пользователь держит прокрутку, просто продолжайте называть метод Ajax отправьте назад каждые 100 строк за раз.

Сервер веб-сервера и базы данных не собирается подавлять 10 000 записей; он будет задыхаться, направляясь к клиенту. Даже если вы откроете сокет в Signal R, я думаю, вы должны спросить себя, действительно ли мне нужно нажимать на клиенту 10 000 строк?

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

Обновлено на основе вашего комментария относительно его прямого SQL

Вот пример выполнения простой версии подкачки в SQL:

DECLARE @intStartRow int;
DECLARE @intEndRow int;

SET @intStartRow = (@intPage -1) * @intPageSize + 1;
SET @intEndRow = @intPage * @intPageSize;    

WITH blogs AS
    (SELECT strBlogName, 
     ROW_NUMBER() OVER(ORDER BY intID DESC) as intRow, 
     COUNT(intID) OVER() AS intTotalHits 
     FROM tblBlog)
SELECT strBlogName, intTotalHits FROM blogs
WHERE intRow BETWEEN @intStartRow AND @intEndRow

Источник: http://joelabrahamsson.com/my-favorite-way-to-do-paging-with-t-sql/