如何在Linq to SQL中实现缓存?

时间:2008-09-01 02:13:07

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

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

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

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

6 个答案:

答案 0 :(得分:38)

我的LINQ query result cache可能正是您正在寻找的。

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

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

皮特。

答案 1 :(得分:9)

快速回答:使用存储库模式(请参阅Evans的Domain Driven Design)来获取实体。每个存储库都会缓存它将保留的东西,理想情况是让每个存储库实例访问一个单独的缓存(每个线程/请求将实例化一个新的存储库,但只能有一个缓存)。

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

答案 2 :(得分:3)

它就在你的鼻子底下:

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

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

答案 3 :(得分:1)

我找到了this post,它提供了一种扩展方法作为缓存LINQ对象的方法。

我现在一直在试图为Linq2SQL寻找一个好的缓存解决方案,因为我必须承认我真的很难找到一个适合所有人的单一尺寸...

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

此外,如果你要缓存你的对象,延迟加载和对象跟踪都是不容易的,这使得执行更新有点棘手。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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