2010-05-02 58 views
1

LINQ to SQL .Count取代了大量處理時間並降低了性能。LINQ to SQL .Count取代了大量處理時間並降低了性能

我做遞歸循環和一個孩子(讓調用它的父),我要檢查下它的兒童人數做出決定是否將其列入與否。

伯爵太慢8毫秒:(120父記錄。

任何想法,使之更快。

+0

你可以發佈生成的SQL嗎? – 2010-05-02 16:56:17

+0

有多少物品正在計數?你能提供一個你的方法的例子嗎? – Brettski 2010-05-02 16:57:49

+0

請張貼一些代碼 - 如果真實代碼太大或以其他方式無法發佈,請使用相同的行爲做一個小例子,這將有助於獲得更好的答案。 – 2010-05-02 18:03:37

回答

2

您可以選擇從數據庫的投影獲取父和子元素的計數它了。這避免了輪跳閘到數據庫中。

var query = from x in DataContext.Parents 
      select new {Parent = x, Count = x.Childs.Count() }; 

現在遍歷結果和任何你想下一個。

若y歐只想濾色器(= where子句中)的基礎上的子元素計數,像這樣做:

var query = from x in DataContext.Parents 
      where c.Childs.Count() > 10 
      select x; 

的LINQ to SQL會嘗試將您的呼叫轉換爲IEnumerable.Count()SELECT COUNT(*),這應該是非常高性能的。

2

對我來說,這聽起來像你循環的結果集,做另一 Linq到SQL查詢每個結果。在這種情況下,它會一直很慢,因爲你會做很多額外的數據庫往返。

你將不得不重寫你的問題讓孩子們一起算在第一個查詢的時候了。

+0

Na沒有做另一個Linq-to-sql 有父和子實體集 – soldieraman 2010-05-02 17:58:04

+0

只要在子引用上調用Count()實際上是另一個linq-to-sql查詢(雖然非常簡單)將導致另一個sql查詢往返數據庫。 – 2010-05-02 19:37:47

+0

好的,你能否提出一個更好的解決方法? – soldieraman 2010-05-03 01:13:13