#c# #sql #asp.net-mvc
#c# #sql #asp.net-mvc
Вопрос:
Я делаю ASP.NET веб-сайт, который отображает данные для пользователя. Он запрашивает базу данных sql для получения этих данных, а затем отображает их в браузере. Таблицы часто содержат более 1 миллиона строк и требуют некоторого времени для загрузки. Вместо того, чтобы пользователю приходилось так долго ждать просмотра страницы, я бы хотел, чтобы страница загружалась, а затем данные добавлялись на страницу по мере ее загрузки. Я могу добиться этого с помощью SignalR, но мой вопрос:
Есть ли в C # способ сказать «select * from tableName», но чтобы он возвращал строки одну за другой, и это самый быстрый способ загрузки данных?
Комментарии:
1. Я не знаю, обеспечивает ли entity framework построчную загрузку данных, но загрузка более 1 миллиона строк в браузере — это довольно большая нагрузка на память. Мой подход к этому заключался бы в том, чтобы сначала предоставить пользователю подкачку, скажем, 10 или 20 записей. Затем, перейдя на следующую или предыдущую страницу, вы можете отфильтровать следующий набор записей. Таким образом, пользовательский интерфейс не будет мешать, и вам не нужно будет загружать все данные сразу.
Ответ №1:
Один из вариантов, который вы можете сделать, — это список по страницам, который помогает при загрузке,
string searchString
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
int pageSize = 5;
int pageNumber = (page ?? 1);
return View(Users.ToPagedList(pageNumber, pageSize));
если вы можете уменьшить объем загружаемых данных, это было бы лучше всего, в моем случае я сделал «select» для загрузки только строк с определенным значением
var VAR = db.YourModel.Where(x => x.YourColumn == YourString/Value).ToList();
Ответ №2:
Вероятно, самым простым способом добиться этого было бы создать серверный метод, который вызывается асинхронно через Ajax и загружается в таблицу. Таким образом, действие, которое загружает представление, не зависит от загрузки таблицы, и записи таблицы будут загружаться по мере их поступления. Кроме того, если данные меняются не очень часто, рассмотрите возможность их кэширования, чтобы последующие загрузки страниц были намного быстрее.
Ответ №3:
SignalR будет работать для этого сценария, есть две точки при загрузке больших наборов данных из БД.
- Никогда не используйте *, вместо этого назовите каждое имя столбца, которое вы хотите.
- Вы можете сначала получить количество записей в таблице, а затем выполнить выборку на основе размера пакета. Например, у вас 1000 записей в БД, а размер вашего пакета равен 100. Таким образом, вы сделаете 10 запросов к БД, чтобы получить все 1000 элементов.