我正在为cms创建一个论坛包并查看缓存一些查询以帮助提高性能,但我不确定缓存下面是否有助于/做下面应该做的事情(BTW:Cachehelper是一个简单的助手类,只需添加和删除缓存)
// Set cache variables
IEnumerable<ForumTopic> maintopics;
if (!CacheHelper.Get(topicCacheKey, out maintopics))
{
// Now get topics
maintopics = from t in u.ForumTopics
where t.ParentNodeId == CurrentNode.Id
orderby t.ForumTopicLastPost descending
select t;
// Add to cache
CacheHelper.Add(maintopics, topicCacheKey);
}
//End Cache
// Pass to my pager helper
var pagedResults = new PaginatedList<ForumTopic>(maintopics, p ?? 0, Convert.ToInt32(Settings.ForumTopicsPerPage));
// Now bind
rptTopicList.DataSource = pagedResults;
rptTopicList.DataBind();
linq只在枚举时才执行吗?那么上面会不会有用呢?当我将它传递给分页帮助器时,它是唯一枚举的.Take()基于查询字符串值'p'(/ p>)的一定数量的记录
答案 0 :(得分:2)
您需要枚举结果,例如调用ToList()
方法。
maintopics = from t in u.ForumTopics
where t.ParentNodeId == CurrentNode.Id
orderby t.ForumTopicLastPost descending
select t;
// Add to cache
CacheHelper.Add(maintopics.ToList(), topicCacheKey);
答案 1 :(得分:0)
我对Linq-to-Sql的经验是,当你开始进入复杂的对象和/或连接时,它不是超级高效的。
第一步是在datacontext上设置LoadOptions。这将强制连接,以便调用完整的记录。这是我写的票务跟踪系统中的一个问题。我正在显示10张票的列表,并且看到了大约70个查询。我有ticket-&gt; substatus-&gt;状态。由于L2S的延迟初始化,导致我在网格中引用的每个对象的每个外键都触发了一个新查询。 这是关于这个主题的博客文章(不是我的)(MSDN很弱):http://oakleafblog.blogspot.com/2007/08/linq-to-sql-query-execution-with.html
下一个选项是创建预编译的Linq查询。我不得不用大连接做到这一点。这是关于该主题的另一篇博客文章:http://aspguy.wordpress.com/2008/08/15/speed-up-linq-to-sql-with-compiled-linq-queries/
下一个选项是将事物转换为使用存储过程。这使得编程和部署更加难以确定,但对于只需要数据子集的复杂查询,它们的速度将提高几个数量级。
我提出这个问题的原因是因为你谈论缓存事物的方式(为什么不在ASP.NET中使用内置的缓存?)会让你长期受到很多麻烦。我建议您构建系统,然后运行SQL跟踪以查看数据库性能问题的位置,然后围绕该跟踪构建优化。您可能会发现您的真正问题不在“前10个主题”中,而在其他方面,更容易修复区域。
答案 2 :(得分:0)
是的,您需要枚举结果。在您枚举结果之前,Linq不会评估您的查询。
如果您想要Linq的一般缓存策略,这是一个很棒的教程:
http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/
最终目标是能够为任何Linq查询自动生成唯一缓存键。