2010-08-10 139 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不是一个东西,它只是一个描述。必须有一些潜在的真实数据结构(如列表或数组)