最近我正在努力实现一个缓存我的结果的小片段,而我正在使用的方式是使用如下字典:
private Dictionary<ID, IQueryable<Results>> _simpleCache;
我们的想法是搜索具有“ID”指定的id的所有结果,如果Dictionary包含key == id,我们只需搜索IQueryable中存在的值,而不是使数据库跳转。 / p>
今天早上我正在讨论这个逻辑,我正在考虑用HashSet替换IQueryable,如下所示:
private Dictionary<ID, HashSet<Results>> _simpleCache;
是否建议进行此更改?
答案 0 :(得分:13)
是的,确实如此。通常,IQueryable<T>
表示您正在使用每次枚举可查询时查询的数据源提供程序(当然,这不是总是的情况,因为您可以调用{{ 3}} AsQueryable上的扩展方法,它会为IQueryable<T>
实现提供IEnumerable<T>
实现。
为此,将IQueryable<Results>
存储在字典中实际上并不会阻止在您第二次枚举时对数据源的任何命中。它会在您通过它枚举的每个时间向数据提供者发出请求。
因此,您通常希望在客户端实现结果,通常调用IEnumerable<T>
或ToList
扩展方法,然后使用IEnumerable<Results>
或Results[]
作为词典的TValue
类型参数。
请注意,您可以使用ToArray
来存储您的对象,但您必须确保实施HashSet<T>
并覆盖IEquatable<T>
,以便默认相等比较器将对ID
类型公开的Results
实例执行比较,或者您必须提供执行相同操作的GetHashCode
实现。您很可能使用设计器生成的代码,并且它不会为您执行此操作,并且您的对象将通过引用而不是按值确定相等。