关于.net:如何在Linq to SQL中实现缓存?

关于.net:如何在Linq to SQL中实现缓存?

How do you implement caching in Linq to SQL?

我们刚刚开始在DAL工作中使用LINQ to SQL


我的LINQ查询结果缓存可能正好是您要查找的内容。

1
2
3
4
5
var q = FROM c IN context.Customers
        WHERE c.City =="London"
        SELECT NEW { c.Name, c.Phone };

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

Pete。


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

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


就在你的nose下面:

1
List<TableItem> myResult = (FROM t IN db.Table SELECT t).ToList();

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


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


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

我一直在努力寻找弱点,现在想为Linq2SQL找到一个好的缓存解决方案,必须承认我确实在努力寻找适合所有人的单一大小...

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

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

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


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

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


推荐阅读