Как мне кэшировать объект IQueryable? - PullRequest
4 голосов
/ 17 июня 2009

У меня есть этот метод, который возвращает запрос Linq-to-SQL для всех строк в таблице UserStatus:

public IQueryable<BLL.Entity.UserStatus> GetAll()
{
    var query = from e in _SelectDataContext.UserStatus
                select new BLL.Entity.UserStatus
                {
                    UserStatusId = e.UserStatusId,
                    Enum = e.Enum,
                    Name = e.Name
                };

    return query;
}

Это просто справочная таблица, которая вряд ли когда-либо изменится, поэтому я бы хотел кешировать результаты. Я могу преобразовать его в List<> и кэшировать его, но я бы предпочел вернуть объект IQueryable, поскольку другие методы в классе зависят от этого. Кто-нибудь может помочь? Спасибо.

Ответы [ 4 ]

7 голосов
/ 17 июня 2009

Может ли query.ToList().AsQueryable() быть решением для вас? не самый лучший, конечно.

3 голосов
/ 17 июня 2009

Вы действительно не можете этого сделать - Querable - это больше указатель, чем данные. Если вы кешируете, вы кешируете данные, поэтому вам необходимо загрузить данные. У Yapiskan правильная идея - кэшировать полученный ToList () и вернуть его в AsQueryable ().

Обратите внимание, что в кэшированном списке не будет DataContext, поэтому параметры вашего запроса будут ограничены данными, загруженными в список.

2 голосов
/ 17 июня 2009

Мне нужно спросить, что вы на самом деле хотите кэшировать? Запрос или результаты?

Если это результаты, то приведенные выше предложения имеют смысл, но если вы хотите кэшировать запрос для последующего использования, тогда я могу предложить использовать CompiledQuery и затем сохранить его где-нибудь ...

Вот статья о CompiledQuery и о том, как его использовать.

Опять же, все зависит от того, хотите ли вы, чтобы запрос был выполнен или нет ...

0 голосов
/ 17 июня 2009

Взгляните на блок приложения кэширования Enterprise Library . Это очень хорошая архитектура кэширования общего назначения.

...