2012-01-09 6 views
0

エンティティフレームワーク接続を使用してMyTblという名前のテーブルからXML文字列のリストを抽出するIDListという整数のリストがあります。 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の特定の値に対する個別の実行は、他のものとほぼ同じ時間がかかります。あなたはEF 4.1で、IDsListに存在するIDを持つ行を取得しようとしている場合は

+0

メソッド#2は非常に大量のデータベース接続を作成し、本質的にDOSフィルタをいくつかのネットワークで起動する可能性があります。 – doogle

答えて

0

、あなたはあなたのクエリで.Containsを使用することができます:あなたは親和性に依存することに注意しなければならない

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が特に並列LINQについて質問していると思います... – Yuck

+0

彼の質問をもう一度読むと、彼のコード例は、リスト "IDList"の整数値で指定されたデータベースから問題が発生していることを具体的に示しています。 – doogle

+0

いいえ...質問にはID値の*非常に大きなリスト*との照合が含まれます。したがって、並列処理。 SQLでは 'Contains()'を使用して 'IN'に変換する適切な方法ですが、本当の問題はPLINQを使ってどちらの方法を使うかということです。 – Yuck

関連する問題