Hashset与IQueryable

sc_*_*ray 5 c# linq generics iqueryable data-structures

最近我正在努力实现一个缓存我的结果的小片段,我这样做的方式是使用如下字典:

 private Dictionary<ID, IQueryable<Results>> _simpleCache;
Run Code Online (Sandbox Code Playgroud)

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

今天早上我正在讨论这个逻辑,我正在考虑用HashSet替换IQueryable,如下所示:

private Dictionary<ID, HashSet<Results>> _simpleCache;
Run Code Online (Sandbox Code Playgroud)

这个改变是否可取?

cas*_*One 13

是的.通常,IQueryable<T>暗示您正在使用每次枚举可查询时查询的数据源提供程序(当然,情况并非总是如此,因为您可以调用AsQueryable扩展方法,IEnumerable<T>这将为您提供IQueryable<T>实现的IEnumerable<T>实现).

为此,IQueryable<Results>当您再次枚举数据源时,将其存储在字典中实际上并不会阻止对数据源的任何命中.每次枚举时,它都会向数据提供者发出请求.

因此,您通常希望在客户端实现结果,通常调用ToListToArray扩展方法,然后使用IEnumerable<Results>Results[]作为TValue字典的类型参数.

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