У меня есть корпоративное приложение в asp.net mvc.Для производительности мы устанавливаем слой кэша в нашем приложении.Рассмотрим код _dataAccess.MyTable.GetList()
в моем приложении.Сначала он проверит кэш, чтобы увидеть, есть ли у нас результаты для этой таблицы.Если мы это сделаем, он вернет результат из кеша, в противном случае он попадет в базу данных и заполнит кеш тоже, чтобы последующие запросы обслуживались нашим кешем.Мы используем Redis для нашего слоя кэширования.И во время кеширования мы не кешируем данные свойств навигации.
Я показал пример кода для моего GetList()
метода.Проблема в том, что метод GetList()
возвращает IQueryable
, поэтому я увеличиваю запрос в соответствии со своими потребностями.Когда запрос обрабатывается моей базой данных, тогда возвращенный IQueryable
работает нормально, так как я обращаюсь к какому-либо свойству навигации по нему, он лениво загружает этот объект.Но для последующего запроса, когда данные возвращаются из кэша, а не из базы данных, свойство навигации не загружает данные лениво.
Есть ли способ не кэшировать содержимое свойств навигации, а только родительские объекты, а затемлениво загружать эти свойства навигации по требованию?
Рассмотрим код _dataAccess.MyTable.GetList().where(x=>x.someNavigationProperty.someProperty=="some val").tolist()
Этот запрос работает нормально, когда из базы данных возвращается IQueryable
, но при возврате из кэша выдает ошибку ссылки на объект.
public IQueryable<TEntity> GetList()
{
if (_cachingStrategy.IsItemExists<TEntity>())
{
return _cachingStrategy.GetList<TEntity>();
}
var data= this._dataStoreStrategy.GetList();
_cachingStrategy.SetList<TEntity>(data.ToList(), TimeSpan.FromDays(100));
return data;
}