Как реализовать кэширование в Linq для SQL?
Мы только начали использовать LINQ to SQL для работы для нашего DAL, и у нас на самом деле нет стандартной модели для кэширования. Раньше мы использовали базовый класс DAL, который реализовал свойство кэширования, которое унаследовало все наши классы DAL, но теперь у нас этого нет. Мне интересно, если кто-нибудь придумал "стандартный" подход для кэширования результатов LINQ to SQL?
Мы работаем в веб-среде (IIS), если это имеет значение. Я знаю, что это может оказаться вопросом subjective, но я все же думаю, что информация была бы ценной.
РЕДАКТИРОВАТЬ: Чтобы уточнить, я не говорю о кешировании индивидуального результата, я больше разбираюсь в решении архитектуры, как в том, как вы настраиваете кэширование, чтобы все ваши методы ссылок используйте ту же архитектуру кэширования.
Ответы
Ответ 1
Быстрый ответ: используйте шаблон репозитория (см. "Проект Driven Design by Evans" ) для извлечения ваших объектов. Каждый репозиторий будет кэшировать все, что он будет удерживать, в идеале, позволяя каждому экземпляру репозитория получить доступ к кешу singleton (каждый поток/запрос будет создавать экземпляр нового репозитория, но может быть только один кеш).
Вышеупомянутый ответ работает только на одной машине. Чтобы использовать это на многих машинах, используйте memcached в качестве своего решения для кеширования. Удачи!
Ответ 2
Мой Кэш результатов запроса LINQ, вероятно, именно то, что вы ищете.
var q = from c in context.Customers
where c.City == "London"
select new { c.Name, c.Phone };
var result = q.Take(10).FromCache();
Пит.
Ответ 3
Это прямо под носом:
List<TableItem> myResult = (from t in db.Table select t).ToList();
Теперь просто кешируйте myResult, так как вы бы кэшировали свои старые возвращаемые данные DAL.
Ответ 4
Я нашел этот пост, который предлагает метод расширения как средство кеширования объектов LINQ.
Я ударился головой о стену для слабых, теперь пытаясь найти хорошее решение для кеширования для Linq2SQL, должно признать, что я действительно изо всех сил стараюсь найти одноразмерный вариант...
Шаблон репозитория имеет тенденцию ограничивать полезность Linq, поскольку (без переопределения IQueryable) кеширование должно выполняться вне оператора Linq.
Кроме того, отложенная загрузка и отслеживание объектов являются большими no-nos, если вы собираетесь кэшировать свои объекты, что делает выполнение обновлений несколько сложнее.
Любой, кто сумел решить эту проблему в дикой природе в рамках высококонкурентного веб-проекта, пожалуйста, звоните и спасайте мир!:)
Ответ 5
Я понимаю, что это, возможно, немного поздний ответ. Тем не менее, вы можете попробовать LinqToCache проект, Он перехватывает SqlDepdency для произвольного запроса LINQ, если это возможно, и обеспечивает активное недействительность кэша через уведомления о запросах на стороне сервера. Запросы должны быть действительными запросами для уведомлений, см. Создание запроса для уведомления. Большинство запросов Linq-to-sql соответствуют этим ограничениям, если таблицы указаны с использованием двух частей (dbo.Table
, а не только Table
).
Ответ 6
См. метод GetReferenceData в классе 'ReferenceData' в в этой статье:
http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/
Он использует кеш страницы asp.net для кэширования данных, полученных с использованием L2S.