Подтвердить что ты не робот

Как реализовать кэширование в Linq для SQL?

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

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

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

4b9b3361

Ответ 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).