2011-02-02 108 views
3

我正在爲cms創建一個論壇包,並正在緩存一些查詢以幫助提高性能,但我不確定緩存下面的內容是否有助於/ BTW:Cachehelper是,只是增加了從高速緩存中刪除)一個簡單的輔助類緩存Linq查詢問題

  // 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只是其列舉時執行?所以上面不會起作用嗎?作爲它唯一枚舉時,我將它傳遞給尋呼助手which.Take()的基於查詢字符串值'p'的一定數量的記錄

回答

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); 
0

我對Linq-to-Sql的經驗是,當你開始進入複雜對象和/或連接時,它不是超級高性能。

第一步是在datacontext上設置LoadOptions。這將強制連接,以便記錄完整的記錄。這是我寫的票據跟蹤系統中的一個問題。我正在顯示10張門票的列表,看到大約70個查詢出現在電匯中。我有票 - > substatus->狀態。由於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個主題」中,而在其他問題中,修復區域要簡單得多。