Как реализовать кэширование в Linq to SQL? - PullRequest
33 голосов
/ 01 сентября 2008

Мы только начали использовать LINQ to SQL на работе для нашего DAL, и мы на самом деле не разработали стандарт для нашей модели кэширования. Ранее мы использовали базовый класс «DAL», в котором реализовано свойство диспетчера кэша, от которого унаследованы все наши классы DAL, но теперь у нас его нет. Мне интересно, придумал ли кто-нибудь «стандартный» подход к кешированию результатов LINQ to SQL?

Мы работаем в веб-среде (IIS), если это имеет значение. Я знаю, что это вполне может оказаться субъективным вопросом, но я все же думаю, что информация будет полезна.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не говорю о кэшировании отдельного результата, я больше интересуюсь архитектурным решением, а также тем, как настроить кэширование так, чтобы все методы ссылок использовали та же архитектура кэширования.

Ответы [ 6 ]

38 голосов
/ 11 декабря 2008

Мой Кэш результатов запроса LINQ , вероятно, именно то, что вы ищете.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

Пит.

9 голосов
/ 01 сентября 2008

Быстрый ответ: используйте шаблон Repository (см. «Управление через домен» от Evans), чтобы получить ваши объекты. Каждый репозиторий будет кэшировать вещи, которые он будет хранить, в идеале, позволяя каждому экземпляру репозитория обращаться к одноэлементному кешу (каждый поток / запрос будет создавать новый репозиторий, но может быть только один кеш).

Ответ выше работает только на одном компьютере. Чтобы использовать это на многих машинах, используйте memcached в качестве решения для кэширования. Удачи!

3 голосов
/ 01 сентября 2008

Это прямо у тебя под носом:

List<TableItem> myResult = (from t in db.Table select t).ToList();

Теперь просто кэшируйте myResult, как если бы вы кэшировали возвращенные данные старого DAL.

1 голос
/ 02 августа 2010

Я понимаю, что это, возможно, немного запоздалый ответ ... Тем не менее, вы можете попробовать проект LinqToCache . Он перехватывает SqlDepdency для произвольного запроса LINQ, если это возможно, и обеспечивает активное аннулирование кэша с помощью уведомлений о запросах на стороне сервера. Запросы должны быть действительными для уведомлений, см. Создание запроса для уведомлений . Большинство запросов Linq-to-sql соответствуют этим ограничениям, если таблицы указываются с использованием имен из двух частей (dbo.Table, а не только Table).

1 голос
/ 21 мая 2010

Я нашел этот пост , который предлагает метод расширения как средство кэширования объектов LINQ.

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

Шаблон репозитория имеет тенденцию ограничивать полезность Linq, поскольку (без переопределения IQueryable) кэширование должно выполняться вне оператора Linq.

Более того, отложенная загрузка и отслеживание объектов - это большие запреты, если вы собираетесь кэшировать ваши объекты, что делает выполнение обновлений несколько сложнее.

Любой, кому удалось решить эту проблему в дикой природе в рамках очень параллельного веб-проекта, пожалуйста, присоединяйтесь и спасите мир! :)

0 голосов
/ 11 декабря 2008

См. Метод 'GetReferenceData' в классе 'ReferenceData' в этой статье : http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

Он использует кеш страниц asp.net для кэширования данных, полученных с помощью L2S.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...