2010-02-24 2 views
5

Недавно я работал над реализацией небольшого фрагмента кода, который кэширует свои результаты и, как я делал это использовало словарь следующим образом:HashSet против IQueryable

private Dictionary<ID, IQueryable<Results>> _simpleCache; 

Идея заключалась в том, чтобы найти все результаты которые имеют идентификатор, указанный в «ID», и если словарь содержит ключ == id, мы просто просматриваем значения, присутствующие в IQueryable, вместо того, чтобы делать попытку базы данных.

Я собирался над этой частью логики сегодня утром, и я думал о замене IQueryable с HashSet следующим образом:

private Dictionary<ID, HashSet<Results>> _simpleCache; 

Делает это изменение целесообразно?

ответ

13

Да, это так. Как правило, IQueryable<T> подразумевает, что вы используете поставщика источника данных, который запрашивается каждый раз, когда запрашивается список (конечно, это не всегда случае, как вы можете позвонить AsQueryable метод расширения на IEnumerable<T>, который даст вам IQueryable<T> реализация над реализацией IEnumerable<T>).

С этой целью хранение словаря IQueryable<Results> в словаре фактически не предотвращает попадание данных в источник данных при повторном перечислении через него. Он направит запрос поставщику данных каждые времени, которое вы перечислите через него.

Из-за этого, обычно требуется, чтобы материализовать результаты на стороне клиента, как правило, вызывая методы расширения ToList или ToArray, а затем с помощью IEnumerable<Results> или Results[] в качестве параметра TValue типа вашего словаря.

Обратите внимание, что вы могли использовать HashSet<T> для хранения объектов, но вы должны убедиться, что вы реализуете IEquatable<T> и переопределить GetHashCode так, что компаратор по умолчанию равенства будет выполнять сравнение по ID экземпляру выставленного Results типа , либо это, либо вы должны предоставить реализацию IEqualityComparer<T>, которая будет делать то же самое. Скорее всего, вы используете созданный конструктором код, и он не сделает этого для вас, и ваши объекты будут иметь равенство, определенное по ссылке, а не по значению.

Смежные вопросы