33

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

如果这有所作为,我们正在 Web 环境 (IIS) 中工作。我知道这很可能最终成为一个主观问题,但我仍然认为这些信息很有价值。

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

4

6 回答 6

39

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

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

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

皮特。

于 2008-12-10T23:18:02.267 回答
10

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

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

于 2008-09-01T07:55:00.320 回答
4

它就在你的鼻子底下:

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

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

于 2008-09-01T03:53:12.680 回答
1

我发现了这篇文章,它提供了一种扩展方法作为缓存 LINQ 对象的一种方式。

我一直在为弱者撞墙,现在试图为Linq2SQL找出一个好的缓存解决方案,必须承认我真的很难找到一个适合所有人的......

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

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

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

于 2010-05-21T02:07:46.380 回答
1

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

于 2010-08-02T03:43:46.303 回答
0

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

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

于 2008-12-11T03:39:20.727 回答