Как мне кэшировать объект IQueryable?

Я получил этот метод, который возвращает запрос Linq-to-SQL для всех строк в «UserStatus». Таблица:

<code>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;
}
</code>

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

 Matthew Whited17 июн. 2009 г., 19:19
Проблема в том, что вам придется позже привязать его к текстовому тексту, если вы хотите использовать его для присоединения к другому запросу. Это если вы не хотите, чтобы объединения или фильтры запускались в памяти.

Ответы на вопрос(4)

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

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

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

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

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

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

Решение Вопроса

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

 Nick17 июн. 2009 г., 22:40
Не знал о методе AsQueryable (). Я думаю, что я, вероятно, в конечном итоге добавлю дополнительный «Список». метод, но это отвечает на вопрос, спасибо.
 07 янв. 2011 г., 17:22
Хорошее решение. Я использовал этот метод. Рабочий пример ниже ....
 07 янв. 2011 г., 17:22
общедоступный IQueryable & lt; ResultWithCount & lt; Country & gt; & gt; GetAllCountries (int? PrimaryCategoryId, int? PrimaryCategoryId) {var key = MakeMedia.CustomClasses.Constants.Persistance.PersistanceKeys.AllCountries + primaryCategoryId + primaryCategoryId; var страны = CacheManager.Get & lt; List & lt; ResultWithCount & lt; Country & gt; & gt; & gt; & gt; & gt; & gt;; if (country == null) CacheManager.Insert (key, _repository.GetAllCountries (primaryCategoryId, secondCategoryId) .ToList ()); return CacheManager.Get & lt; List & lt; ResultWithCount & lt; Country & gt; & gt;> (ключ) .AsQueryable (); }

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

Ваш ответ на вопрос