2010-08-10 219 views
0

大多數人會推薦緩存作爲列表。我知道這是一個解決方案,可能是我一起去的。但是,如果希望能夠使用完整的IQueryable(IEnumerable?)功能來處理緩存的linq-to-sql,該怎麼辦?緩存linq-to-sql結果?

如果試圖緩存原始結果,則會出現錯誤「查詢結果不能枚舉超過一次」。

因此,要明確我的問題是:

  1. 是對列表,IQueryable的哈希碼,和IEnumerable獨特之處?
  2. 如果我想安全地緩存linq-to-sql結果並提供最大的功能,我該怎麼做?
+0

緩存本地數據,同時保持完整的IQueryable能力是感興趣的衝突。 Linq-to-SQL中的IQueryable的目的是將LINQ表達式轉換爲SQL。 – kbrimington 2010-08-10 18:56:22

+0

@Kbrimington也許我需要一個Ienumerable呢?我想對緩存結果使用過濾功能。這也是理想的,我不需要知道我是使用緩存還是非緩存數據。我承認我沒有查看接口,看看哪些是必需的,但我相當肯定列表是更有限..也許擴展方法提供了。 – 2010-08-10 18:58:37

回答

1

一旦你緩存了一個IEnumerable,它就是一個仍然可以自行查詢的「水合」列表。該AsQueryable()方法可用於對查詢被填充到列表中記錄的子集:

IEnumerable foo = from o in ctx.MyObjects 
        select o; 

foo.ToList(); 

IEnumerable bar = from f in foo.AsQueryable() 
        select f; 

下面是使用AsQueryable已()一些更多的好信息: http://weblogs.asp.net/zeeshanhirani/archive/2008/07/31/using-asqueryable-with-linq-to-objects-and-linq-to-sql.aspx

+0

謝謝。這是另一個好的http://www.weirdlover.com/2010/05/11/iqueryable-can-kill-your-dog-steal-your-wife-kill-your-will-to-live-etc/ – 2010-08-10 19:02:42

+0

你在那裏的'foo.ToList()'不會做任何有用的事情。這是否有原因? – 2010-08-10 19:05:03

+0

關於gethashcode()如何適用於列表類型的想法/顏色? – 2010-08-10 19:05:07

1

但是,如果一個人想能夠治療緩存LINQ到SQL具有完全的IQueryable(IEnumerable的?)的功能是什麼?

List<T>這個類實現了IEnumerable<T>,如果你願意,你可以使用LINQ查詢它。

大多數人會推薦緩存作爲列表。

我想說這取決於您打算如何處理緩存數據。 A List<T>在許多情況下都很好。如果您希望基於唯一密鑰進行快速查找,則最好將緩存數據存儲在Dictionary<TKey, TValue>中。

0

究竟什麼是你緩存? IQueryable不是結果(查詢是問題,而不是答案)。

此外,一個IEnumerable不是一個東西,它只是一個描述。必須有一些潛在的真實數據結構(如列表或數組)