2010-11-21 61 views
1

我們有兩個表:
家長
ID:整數//主鍵
名稱:字符串
數據集關係或linq尋找更好的性能?

兒童
FK://整數參考Parent.ID
MoreInfo:字符串

家長有100,000行,孩子有10,000行(父母中的很多行是在孩子未使用)

目前我們做的事:

MyDS.Relations.Add("PC", MyDS.Tables["Parent"].Columns["ID"], 
         MyDS.Tables["Child"].Columns["FK"]); 
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable()) 
    DataRow drParent = drChild.GetParentRows(MyDS.Relations["PC"]).FirstOrDefault(); 

我們想改變,只是使用LINQ手動搜索的:

foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable()) 
    DataRow drParent = MyDS.Tables["Parent"].AsEnumerable().FirstOrDefault(
            drParent => drParent["ID"] == drChild["FK"]); 

表兒童只通過一次,然後迭代數據集被丟棄。任何人都有使用某種方法或其他方法的經驗 - 如果僅使用一次,在method1中創建關係會浪費時間嗎?

回答

1

建立關係絕對不是浪費時間。

每當評估問題的兩種潛在解決方案時,您應該總是比較每個選項的成本/時間。從那裏你通常可以打電話,哪個選擇更好。要記住的一件事是DataRelation存在以優化這些類型的查找。

如果將DataRelation添加到現有表中,則需要大約125ms來添加關係(創建所需散列以通過數據鍵映射父/子行)。

使用DataRelation只需要70ms查找10,000個子行中每個子行的每個父行,其中僅使用上面記錄的Linq方法需要超過4分鐘。

當你考慮這個問題時,這是有意義的,因爲第一個將遍歷10,000個子行,並使用DataRelation的映射數據鍵查找父行(不需要遍歷所有100,000個父級)。但是,第二種解決方案必須遍歷每個子行(10,000)並搜索100,000個父行以找到適合的匹配項(10,000 x 100,000 = 1,000,000,000)。