2010-02-24 6 views
5

Récemment, je travaillais sur la mise en œuvre d'un petit extrait qui met en cache mes résultats et la façon dont je faisais utilisait un dictionnaire comme suit:HashSet contre IQueryable

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

L'idée était de rechercher tous les résultats qui ont l'ID spécifié par 'ID' et si le dictionnaire contient la clé == id, nous cherchons simplement à travers les valeurs présentes dans le IQueryable au lieu de faire un voyage de base de données.

Je repassais ce morceau de logique ce matin et je pensais à remplacer le IQueryable avec HashSet comme suit:

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

fait ce changement souhaitable?

Répondre

13

Oui, c'est. Généralement, IQueryable<T> implique que vous utilisez un fournisseur de source de données qui est interrogé à chaque fois que l'interrogeable est énuméré (bien sûr, ce n'est pas le cas, comme vous pouvez appeler AsQueryable méthode d'extension sur un IEnumerable<T> qui vous donnera un Implémentation IQueryable<T> sur l'implémentation IEnumerable<T>). Pour cela, stocker le IQueryable<Results> dans un dictionnaire n'empêche pas réellement les appels à la source de données lorsque vous l'énumérez une seconde fois. Il fera une demande au fournisseur de données chaque temps que vous énumérer à travers lui.

À cause de cela, vous voulez généralement matérialiser les résultats du côté client, appeler généralement les ToList ou ToArray méthodes d'extension, puis en utilisant IEnumerable<Results> ou Results[] comme paramètre de type TValue de votre dictionnaire.

Notez que vous pouvez utiliser un HashSet<T> pour stocker vos objets, mais vous devez vous assurer que vous implémentez IEquatable<T> et passer outre GetHashCode de telle sorte que le comparateur d'égalité par défaut effectuera une comparaison sur l'instance ID exposés par le type Results , soit cela, ou vous devez fournir une implémentation IEqualityComparer<T> qui fera la même chose. Il est plus que probable que vous utilisez du code généré par un concepteur, et il ne le fera pas pour vous, et vos objets auront une égalité déterminée par référence, et non par valeur.