Большой запрос, как вернуть результаты в разделы С#/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/