Какова лучшая структура для (или вместо) использования нескольких частичных представлений? - PullRequest
0 голосов
/ 08 марта 2011

У меня есть представление, которое вызывает четыре различных частичных представления (.ascx), чтобы заполнить часть представления через вызов RenderAction.Каждое из частичных представлений использует одну и ту же модель представления, но каждое возвращает различный набор данных через собственный запрос EF в базовой модели.Как вы могли бы предположить из общего доступа к модели представления, все частичные представления возвращают почти одинаковый тип информации - разница заключается в фильтрации.Например, «Новые продукты» против «Популярные продукты» против «Рекомендуемые продукты» и т. Д.

Я получаю нужные данные, но мне нужно обратиться к структуре, потому что моя производительность довольно низкая.Производительность каждого отдельного запроса не кажется слишком плохой (я использовал LinqPad и протестировал сгенерированный SQL в SQL Server, и производительность отличная).Однако в целом время загрузки страницы довольно скудное, так как я переключаю категории и перезагружаю страницу.

Вместо того, чтобы вызывать 4 запроса к серверу SQL, могу ли я вызвать тот, который извлекает все (для всех 4), а затем фильтровать результаты в отдельные частичные представления?Будет ли это лучше?

Большое спасибо за ваши предложения / советы.

1 Ответ

0 голосов
/ 08 марта 2011

Да.Выполнение одного запроса и фильтрации было бы намного лучше.

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 и используйте атрибуты выходного кэша для действий.

...