2017-11-29 13 views
-1

私はidListと呼ばれるintのリストを持っています。そのidList内の各IDのTaskStateテーブルのTaskStateを更新したいと思います。これは私のコードは、今どのように見えるかです:更新クエリを最適化し、ループ内で実行しますか?

using (SqlConnection dataconnection = new SqlConnection(DB)) 
{ 
    SqlCommand sqlCommandDelete = new SqlCommand() 
    { 
     Connection = dataconnection 
    }; 

    dataconnection.Open(); 

    foreach (var id in idList) 
    { 
     qlCommandDelete.CommandText = $"UPDATE Tasks SET TaskState = 2 WHERE TaskID = {id}"; 
     sqlCommandDelete.ExecuteNonQuery(); 
    } 
} 

今の問題は、私は毎回私が最適であるかわからないループ火災をクエリを実行することです。おそらく、すべての更新ステートメントを接続して一度だけクエリを実行する方法はそれほど重くないでしょうか?

+3

を次のようにして、SQL文を書くこの

var ids = idList.Aggregate((x, y) => $"{x}, {y}") 

のようにそれを行うことができ、 "、idList)})") – Evk

+0

あなたはTVP –

答えて

2

あなたは、 `$ "UPDATE ... WHEREタスクID IN({String.Join(" 例えば

qlCommandDelete.CommandText = $"UPDATE Tasks SET TaskState = 2 WHERE TaskID in ({ids})"; 
+1

+1を試すことができます。TaskIdはIntのような注入安全型であると仮定します。 'String.Join'を使うだけです - 連結問題を保存します。クエリには[最終的にはサイズ制限があります](https://stackoverflow.com/a/8808935/314291)がありますので、多数のTaskIdsでバッチ処理が必要な場合があります。文字列の場合、[パラメータ化が必要です](https://stackoverflow.com/a/337792/314291) – StuartLC

関連する問題