【问题标题】:Caching linq-to-sql results?缓存 linq-to-sql 结果?
【发布时间】:2010-08-10 18:53:38
【问题描述】:

大多数人会建议将缓存作为列表。我知道这是一个解决方案,可能是我选择的解决方案。但是,如果希望能够处理具有完整 IQueryable (IEnumerable?) 功能的缓存 linq-to-sql 怎么办?

如果确实尝试缓存原始结果,则会出现错误“查询结果无法枚举多次”。

所以,为了明确我的问题是:

  1. Lists、IQueryable 和 IEnumerable 的哈希码是否唯一?
  2. 如果我想安全地缓存 linq-to-sql 结果并在之后提供最大功能,我该怎么做?

【问题讨论】:

  • 在保持完整的 IQueryable 功能的同时缓存本地数据是利益冲突。 Linq-to-SQL 中 IQueryable 的目的是将 LINQ 表达式转换为 SQL。
  • @Kbrimington 也许我需要一个 Ienumerable 吗?我想对缓存结果使用过滤功能。我不需要知道我使用的是缓存数据还是非缓存数据也是理想的。我承认我没有查看接口来查看哪些接口是必需的,但我相当确定列表更有限。也许扩展方法提供了这一点。

标签: .net linq linq-to-sql caching


【解决方案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

【讨论】:

  • 谢谢。这是另一个不错的weirdlover.com/2010/05/11/…
  • 您拥有的foo.ToList() 不会做任何有用的事情。这是有原因的吗?
  • @Mark:对 ToList() 的调用将实际执行查询并填充列表。在那之前它只是一个表达式树。
  • @Curtis:GetHashCode 方法适用于 List 或 List 与任何其他类型相同。默认散列算法对对象的状态进行一些内省(它是一个列表这一事实是无关紧要的)并将其与对象的类型相结合以生成一个散列,该散列可用于唯一标识该 instance i> 的列表对象 用于该进程。 不同进程中的相同实例(按状态)可以生成不同的哈希。
  • "默认的散列算法对对象的状态做了一些内省" 不,它只使用对象标识。它不看内容。
【解决方案2】:

但是,如果希望能够处理具有完整 IQueryable (IEnumerable?) 功能的缓存 linq-to-sql 怎么办?

List<T> 类实现了IEnumerable<T>,如果您愿意,可以使用 LINQ 查询它。

大多数人会推荐缓存作为列表。

我会说这取决于您打算如何处理缓存数据。 List<T> 在很多情况下都可以。如果您想基于唯一键进行快速查找,最好将缓存数据存储在 Dictionary<TKey, TValue> 中。

【讨论】:

    【解决方案3】:

    你到底在缓存什么? IQueryable 不是结果(查询是问题,而不是答案)。

    此外,IEnumerable 不是一个东西,它只是一个描述。必须有一些底层的真实数据结构(如列表或数组)

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2010-10-10
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多