2017-11-29 8 views
-1

Ich habe eine Liste von Ints namens idList. Ich möchte den TaskState in der Tabelle "Tasks" für jede ID in dieser ID-Liste aktualisieren. Dies ist, wie mein Code sieht jetzt:Optimieren von Aktualisierungsabfragen, Ausführen in einer Schleife?

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(); 
    } 
} 

Das Problem ist jetzt, dass ich Abfrage ausführen, jedes Mal, wenn die Schleife Feuer, die ich bin nicht sicher, optimal ist. Gibt es vielleicht eine Möglichkeit, alle update-Anweisungen zu verbinden und die Abfrage nur einmal auszuführen, die weniger schwer wäre?

+3

Zum Beispiel folgt, '$ "UPDATE ... WHERE TaskId IN ({String.Join (" ", idList)})" ' – Evk

+0

Sie können versuchen mit TVP –

Antwort

2

Sie können es wie dieses

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

tun Sie dann auf SQL Text schreiben, wie

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

+1 unter der Annahme, dass TaskId ein Injection-sicherer Typ wie Int ist. Verwenden Sie einfach 'String.Join' - speichert das Verkettungsproblem. Es gibt jedoch [letztendlich eine Größenbeschränkung] (https://stackoverflow.com/a/8808935/314291) für die Abfrage, daher ist eine Stapelverarbeitung bei einer großen Anzahl von TaskIds möglicherweise noch erforderlich. Für Strings wird [Parametrierung benötigt] (https://stackoverflow.com/a/337792/314291) – StuartLC

Verwandte Themen