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

时间:2020-03-05 18:45:47  来源:igfitidea点击:

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

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

编辑:为澄清起见,我不是在讨论缓存单个结果,而是在寻求一种体系结构解决方案,例如如何设置缓存,以便所有链接方法都使用同一缓存体系结构。

解决方案

回答

就在你的鼻子下面:

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

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

回答

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

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

回答

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

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

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

皮特

回答

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

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

回答

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

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

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

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

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

回答

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