2010-02-24 57 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>實現,將做同樣的事情。您使用設計器生成的代碼的可能性很大,而且它不會爲您執行此操作,並且您的對象將通過引用而不是由值來確定相等性。