#asp.net-mvc #performance #partial-views #renderaction
#asp.net-mvc #Производительность #частичные представления #визуализация
Вопрос:
У меня есть представление, которое вызывает четыре разных частичных представления (.ascx) для заполнения части представления с помощью вызова RenderAction . Каждое из частичных представлений использует одну и ту же модель представления, но каждое возвращает различный набор данных через свой собственный запрос EF в базовой модели. Как можно было бы предположить из общего доступа к viewmodel, все частичные представления возвращают практически один и тот же тип информации — разница заключается в фильтрации. Например. «Новые продукты» против «Популярных продуктов» против «Рекомендуемых продуктов» и т.д.
Я получаю нужные мне данные, но мне нужно обратиться к структуре, потому что моя производительность довольно низкая. Производительность каждого отдельного запроса не кажется слишком плохой (я использовал LINQPad и протестировал сгенерированный SQL в SQL Server, и производительность отличная). Однако в целом время загрузки страницы довольно невелико, поскольку я переключаю категории и перезагружаю страницу.
Вместо вызова 4 запросов к SQL server, могу ли я вызвать тот, который извлекает все (для всех 4), а затем фильтрует результаты по отдельным частичным представлениям? Было бы это лучше?
Большое спасибо за ваши предложения / рекомендации.
Ответ №1:
ДА. Выполнение одного запроса и фильтрация были бы намного лучше.
List<Widgets> widgetsFromQuery = (from w in db.Widgets
where w.Name.EndsWith("-sprocket") ||
w.Name.EndsWith("-seat") ||
w.Name == "toaster"
select c).ToList();
Вызов ToList() в конце заставляет Linq немедленно выполнить запрос.
Затем вы используете widgetsFromQuery в качестве своей модели и в каждом представлении фильтруете следующим образом:
var filteredModel = Model.Select(w => w.Name.EndsWith("-sprocket"));
var filteredModel = Model.Select(w => w.Name.EndsWith("-seat"));
var filteredModel = Model.Select(w => w.Name == "toaster"));
Дальнейшее повышение производительности было бы чем-то вроде:
1) Кэшируйте выходные данные запроса в сеансе (если он зависит от пользователя) или кеше приложения, если нет.
2) Привязать каждое представление к действию, загрузить с помощью AJAX и использовать атрибуты кэша вывода для действий.
Комментарии:
1. Спасибо за ваш ответ. Я не прошу пример кода, но можете ли вы объяснить, как / где я бы отфильтровал исходный запрос по отдельным частичным представлениям? Когда я задавал свой первоначальный вопрос, я исходил из предпосылки, что это <должно> быть возможно, но я не знаю, как я мог бы сделать что-то подобное. Что касается ваших (1) и (2) — спасибо. Это выше моего понимания… необходимо будет изучить / прочитать, как выполнить. Еще раз спасибо.
2. карман, я отредактировал свой ответ, включив в него пример. P.S. Кэширование на самом деле не такое уж сложное, и тебе стоит когда-нибудь освоить AJAX, это здорово.