2012-01-09 88 views
0

我有一個名爲IDsList的整數列表,用於使用實體框架連接從名爲MyTbl的表中提取XML列表。 XML字符串然後用於執行其他任務。以下哪一項會更好?循環中的實體框架連接

方法1

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<String> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) { 
    XMLStrs = IDsList.Select (i => Ctx.MyTbl.First (tr => tr.id == i).xml_str).ToList(); 
} 
XMLStrs.AsParallel().ForAll (xs => { 
    // Do something in parallel 
}); 

方法2

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
IDsList.AsParallel().ForAll (i => { 
    using (var ctx = new DatabaseEntities()) { 
     var xs = ctx.MyTTbl.First (tr => tr.id == i).xml_str; 
     // Do something with xs 
    } 
}); 

還是有不同的方法,該方法是更地道C#?

請注意 IDslist通常是一個更長的列表,通常數以千計的長度。並且每個獨立的xs執行時間與其他時間大致相同。

+0

你應該注意的是,根據親和力的機器和你的過程,方法#2可以創建大量的數據庫連接,本質上觸發一些網絡中的DOS過濾器。 – doogle 2012-01-09 18:54:16

回答

0

如果你正在試圖獲得具有存在於IDsList,與EF 4.1的ID行,您可以在查詢中使用。載:

var IDsList = new []{17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<string> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) 
{ 
    XMLStrs = (from tr in Ctx.MyTbl 
       where IDsList.Contains(tr.id) 
       select tr.xml_str).ToList(); 
} 
+1

我認爲OP是特別詢問Parallel LINQ ... – Yuck 2012-01-09 18:52:41

+0

再次閱讀他的問題,他的代碼示例特別指出問題是從列表「IDsList」中的整數值指定的數據庫中獲取行。 – doogle 2012-01-09 18:56:43

+0

不......這個問題涉及匹配一個非常大的ID值列表。因此並行處理。雖然使用'Contains()'是在SQL中轉換爲'IN'的正確方法,但真正的問題是使用PLINQ更喜歡哪種方法。 – Yuck 2012-01-09 19:10:47