我们刚刚开始在 DAL 中使用 LINQ to SQL,而且我们还没有真正制定出缓存模型的标准。以前,我们使用了一个基“DAL”类,该类实现了所有 DAL 类继承的缓存管理器属性,但现在我们没有了。我想知道是否有人提出了一种“标准”方法来缓存 LINQ to SQL 结果?

如果这有影响的话,我们正在网络环境(IIS)中工作。我知道这很可能最终会成为 主观 问题,但我仍然认为这些信息很有价值。

编辑: 澄清一下,我不是在谈论缓存单个结果,我更多的是寻求一种架构解决方案,例如如何设置缓存,以便所有链接方法都使用相同的缓存架构。

有帮助吗?

解决方案

快速回答:使用存储库模式(请参阅 Evans 的领域驱动设计)来获取实体。每个存储库都会缓存其将保存的内容,理想情况下是让存储库的每个实例访问单例缓存(每个线程/请求将实例化一个新存储库,但只能有一个缓存)。

上述答案仅适用于一台机器。为了能够在许多机器上使用它,请使用 内存缓存 作为您的缓存解决方案。祝你好运!

其他提示

我的 LINQ查询结果缓存 可能正是您正在寻找的。

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

皮特.

它就在你眼皮底下:

List<TableItem> myResult = (from t in db.Table select t).ToList();

现在,只需缓存 myResult,就像缓存旧 DAL 返回的数据一样。

我发现 这个帖子, ,它提供了一个扩展方法作为缓存 LINQ 对象的方法。

我一直在为弱点而苦苦挣扎,现在试图为 Linq2SQL 找出一个好的缓存解决方案,必须承认我真的很难找到一个通用的解决方案......

存储库模式往往会限制 Linq 的实用性,因为(无需重新实现 IQueryable)缓存必须在 Linq 语句之外执行。

此外,如果您要缓存对象,则延迟加载和对象跟踪都是大忌,这使得执行更新变得有些棘手。

任何在高度并发的 Web 项目中成功解决这个问题的人,请加入并拯救世界!:)

我知道这可能是有点晚的答案......尽管如此,你可以尝试一下 LinqToCache 项目。如果可能的话,它将 SqlDepdency 挂接到任意 LINQ 查询上,并通过服务器端查询通知提供活动缓存失效。查询必须是有效的通知查询,请参阅 创建通知查询. 。大多数 Linq-to-sql 查询都符合这些限制,只要使用两部分名称指定表即可 (dbo.Table, , 不仅 Table).

请参阅“ReferenceData”类中的“GetReferenceData”方法 本文: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

它使用 asp.net 页面缓存来缓存使用 L2S 检索的数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top