2016-04-15 107 views
0

我有這種方法,根據網站是否有任何具有任何外部鏈接的頁面返回true或false。linq查詢導致性能問題

該方法可行。然而,這是非常緩慢的。就像處理一個合計5000頁的100個網站大約需要5秒鐘一樣。

protected bool WebsitesWithExternalLinks(int id) 
    { 
     var website = FetchModel(id); 
     if (website == null) return false; 
    //return true; 
     var externalLinks = website.WebPages 
          .Any(wp => wp.Links != null && 
            wp.Links.ExternalLinks.Any()); 
     return externalLinks; 
    } 

我已經精確定位緩慢在LINQ查詢某處存在的,但我不明白爲什麼它的發生。我有其他的linq查詢在WebSite和WebSage對象上運行非常快。

我不知道爲什麼這個這麼慢。

有沒有什麼辦法來加速LINQ查詢或用其他東西替換它們?

+0

假設這個查詢數據庫,你能發佈相關表的模式嗎? –

回答

3

由語句...

var website = FetchModel(id); 

...你從數據庫中獲取一個website。然後你訪問website.WebPages。這會在單獨的查詢(延遲加載)中加載該website的所有WebPages。然後,對於這些頁面中的每一個,ExternalLinks都是在更多獨立查詢中查詢,直到發現第一頁具有至少一個外部鏈接。所以如果有很多頁面沒有鏈接,這會花費大量的時間。

補救措施是在一個查詢中完成。直接使用上下文,它看起來像這樣:

var externalLinks = 
    context.Websites 
      .Any(w => w.Id == id 
        && w.WebPages 
         .Any(wp => wp.Links.ExternalLinks.Any())); 

這將執行一個只返回布爾值的查詢。

從這裏我無法判斷這是如何適合您的架構的。取決於你深入瞭解上下文的深度,以及你允許自己塑造用它執行的查詢的自由程度。