2010-02-24 58 views
5

最近我正在实施一个小片段,缓存我的结果,并曾用字典如下我做的方式:对比的Hashset IQueryable的

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

当时的想法是,以搜索所有结果有'id'指定的id,如果Dictionary包含key == id,我们只需搜索IQueryable中存在的值,而不是进行数据库访问。

今天上午我去在这片逻辑,我想用一个HashSet替换的IQueryable如下:

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

使得这一变化可取?

回答

13

是的。一般来说,IQueryable<T>意味着你正在使用一个数据源提供程序查询每次查询是枚举(当然,这不是总是的情况下,因为你可以拨打AsQueryable扩展方法在IEnumerable<T>这将给你一个通过IEnumerable<T>执行实施的IQueryable<T>实施)。

为此目的,将字典IQueryable<Results>存储在字典中时,实际上并不会阻止您在第二次枚举数据源时遇到任何命中。每过时间,它都会向数据提供商发送请求。

正因为如此,你通常要兑现对客户端的结果,通常调用ToListToArray扩展方法,然后使用IEnumerable<Results>Results[]作为你的字典的TValue类型参数。

请注意,您可以使用HashSet<T>来存储你的对象,但你必须确保你实现IEquatable<T>并覆盖GetHashCode使默认的相等比较将执行对ID例如由Results类型暴露的比较,无论是,或者你必须提供一个IEqualityComparer<T>实现,将做同样的事情。您使用设计器生成的代码的可能性很大,而且它不会为您执行此操作,并且您的对象将通过引用而不是由值来确定相等性。