缓存Linq查询问题

时间:2011-02-02 06:34:58

标签: c# asp.net linq ienumerable

我正在为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>)的一定数量的记录

3 个答案:

答案 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查询自动生成唯一缓存键。

相关问题