Как Вы реализуете кэширование в Linq к SQL?

tl; dr: «PECS» находится с точки зрения коллекции. Если вы только вытаскиваете предметы из общей коллекции, это производитель, и вы должны использовать extends; если вы загружаете только элементы, это потребитель, и вы должны использовать super. Если вы делаете оба с одной и той же коллекцией, вы не должны использовать либо extends, либо super.


Предположим, что у вас есть метод, который принимает в качестве параметра набор вещей, но вы хотите, чтобы он был более гибким, чем просто принятие Collection<Thing>.

Случай 1: вы хотите пройти коллекцию и делать вещи с каждым элементом. Затем список будет производителем, поэтому вы должны использовать Collection<? extends Thing>.

. Поводом является то, что Collection<? extends Thing> может содержать любой подтип Thing, и поэтому каждый элемент будет вести себя как Thing ] при выполнении операции. (Фактически вы не можете добавить что-либо к Collection<? extends Thing>, потому что во время выполнения вы не можете знать, какой подтип [] Thing содержится в коллекции.)

Случай 2: вы хотите добавьте вещи в коллекцию. Затем список - это потребитель, поэтому вы должны использовать Collection<? super Thing>.

. Здесь рассуждение состоит в том, что в отличие от Collection<? extends Thing>, Collection<? super Thing> всегда может удерживать Thing независимо от того, какой фактический параметризованный тип является. Здесь вам все равно, что уже есть в списке, если он позволит добавить Thing; это то, что гарантирует ? super Thing.

33
задан Community 23 May 2017 в 12:17
поделиться

6 ответов

Быстрый ответ: Используйте шаблон Репозитория (см. Доменный Управляемый Дизайн Evans) выбирать Ваши объекты. Каждый репозиторий будет кэшировать вещи, которые он будет содержать, идеально путем разрешения каждому экземпляру доступа к репозиторию одноэлементный кэш (каждый поток/запрос инстанцирует нового репозитория, но может быть только один кэш).

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

9
ответ дан 27 November 2019 в 18:22
поделиться

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

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

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

Pete.

38
ответ дан 27 November 2019 в 18:22
поделиться

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

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

0
ответ дан 27 November 2019 в 18:22
поделиться

Это правильно под Вашим носом:

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

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

4
ответ дан 27 November 2019 в 18:22
поделиться

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

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

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

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

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

1
ответ дан 27 November 2019 в 18:22
поделиться

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

1
ответ дан 27 November 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: