2010-02-24 11 views
5

Hace poco estaba trabajando en la implementación de un pequeño fragmento que almacena en caché mis resultados y la forma en que lo hacía estaba usando un diccionario de la siguiente manera:hashset vs IQueryable

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

La idea era buscar todos los resultados que tienen el ID especificado por 'ID' y si el Diccionario contiene la clave == id, simplemente buscamos a través de los valores presentes en IQueryable en lugar de hacer un viaje a la base de datos.

Iba sobre esta pieza de la lógica de esta mañana y yo estaba pensando en reemplazar el IQueryable con HashSet de la siguiente manera:

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

está haciendo este cambio aconsejable?

Respuesta

13

Sí, lo es. Generalmente, IQueryable<T> implica que está utilizando un proveedor de fuente de datos que se consulta cada vez que se enumera el consultable (por supuesto, esto no es siempre el caso, ya que puede llamar al método de extensión AsQueryable en un IEnumerable<T> que le dará un IQueryable<T> implementación sobre la implementación IEnumerable<T>).

Para ese fin, almacenar IQueryable<Results> en un diccionario en realidad no previene ningún golpe al origen de datos cuando lo enumera por segunda vez. Realizará una solicitud al proveedor de datos cada vez que lo enumera.

Debido a esto, normalmente se quieren materializar los resultados en el lado del cliente, normalmente llamando a los ToListToArray o métodos de extensión y, a continuación, utilizando IEnumerable<Results> o Results[] como parámetro TValue tipo de su diccionario.

Tenga en cuenta que podría utilizar un HashSet<T> para almacenar sus objetos, pero hay que asegurarse de que implemente IEquatable<T> y anular GetHashCode de modo que el comparador de igualdad predeterminado llevará a cabo una comparación en la ID ejemplo expuesto por el tipo Results , o eso, o tiene que proporcionar una implementación IEqualityComparer<T> que hará lo mismo. Es más que probable que esté usando código generado por un diseñador, y no hará esto por usted, y sus objetos tendrán igualdad determinada por referencia, no por valor.