Какая наилучшая структура для (или вместо) использования нескольких частичных представлений?

#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, это здорово.