Сохранение переменной в запросах контроллера .NET MVCC#

Место общения программистов C#
Anonymous
Сохранение переменной в запросах контроллера .NET MVC

Сообщение Anonymous »

У меня странная ситуация: меня попросили оптимизировать функцию поиска, которая зависит от отложенной загрузки. Я понял, что основная проблема со скоростью связана с временем ожидания между запросами на подкачку (приблизительно 1,5 секунды), а в коде я понимаю, что каждый запрос страницы, который обрабатывает контроллер, заставляет модель выполнять полный запрос к БД (вместо частичный запрос только для результатов этой страницы).

Мы используем собственную ORM, поэтому я не уверен, что она обрабатывает с точки зрения разбиения на страницы (и Думаю, поэтому это и было реализовано именно так). Мы сохраняем результаты БД в IEnumerable, который затем фильтруем с помощью LINQ, чтобы получить правильные результаты страницы.

Я хотел бы кэшировать этот запрос. в памяти — поскольку мы помещаем полный результат в IEnumerable, было бы удобно просто сохранить его где-нибудь (даже если мне придется передать его в свою модель).

Кто-то предложил использовать статическую переменную в моем контроллере или модели, но я думаю, что при множественных запросах это приведет к сбою. Я думаю, что может быть способ временно сохранить это в переменной сеанса на стороне сервера и удалить его после завершения всех запросов страниц. Кеширование вручную, если хотите.

Я знаю, что это не лучший способ сделать это, но, возможно, это единственный разумный вариант, который у меня есть с точки зрения оптимизации ( если мы не перейдем на другой ORM). Есть ли у кого-нибудь предложения, идеи или критика? Как бы я реализовал что-то подобное?

Спасибо.

Код контроллера:

[HttpGet, JsonErrorCatcher, NoCache]
public ActionResult Accounts(int page = 0)
{
using (var context = PersistenceContext.Create())
{
var model = new ContactsModel(context);
return new JsonNetResult(model.GetAccountsWebView(CurrentUser, page));
}
}


Метод модели:

public ContactsWebViewModel GetAccountsWebView(User user, int page)
{
// This is what I'd like to avoid doing every time, by persisting this value.
// I can pass it into this method if necessary.
IEnumerable accounts = Context.Get()
.Include(x => x.AssignedGroups)
.Include(x => x.AssignedUsers)
.Include(x => x.Contacts)
.Where(x => x.IsActive)
.OrderBy(x => x.Name)
.ToArray();
if (!user.HasPermission("Administrator.Contacts:View")) accounts = accounts.Where(x => x.IsReadableBy(user));
int totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(accounts.Count()) / 25.0));
accounts = accounts.Skip(page * 25).Take(25);
var model = GetWebView(user, null, accounts, page == 0);
model.TotalPages = totalPages;
return model;
}


Подробнее здесь: https://stackoverflow.com/questions/216 ... r-requests

Вернуться в «C#»