2013-05-22 3 views
0

Je suis en train de supprimer plusieurs lignes EF5 et j'utilise l'exemple de code suivantSupprimer plusieurs lignes dans Entity Framework

string TestId = "12,23"; 
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId)); 

Comment passer je SqlParameter pour IN? Je suis en train de passer une chaîne de valeurs séparées par des virgules

Merci

Répondre

0

La seule façon que vous pouvez passer nombre dynamique de valeurs dans la requête SQL TESTID IN (...) partie est d'utiliser un sous-sélection. Cela s'applique à la requête SQL elle-même, il n'y a donc aucun type de paramètre qui résoudra votre problème.

Votre alternative est de construire la requête dynamiquement en utilisant la concaténation de chaîne et une vérification minutieuse de chaque argument.

Puisque vous travaillez avec des ID, ils sont probablement des entiers.

List<int> testId = ...; 
var sb = new StringBuilder(); 
sb.Append("DELETE FROM TEST WHERE TESTID IN ("); 
bool first = true; 
foreach (var i in testId) 
{ 
    if (first) 
     first = false; 
    else 
     sb.Append(","); 
    sb.Append(i.ToString(CultureInfo.InvariantCulture)); 
} 
sb.Append(")"); 
Context.Database.ExecuteSqlCommand(sb.ToString()); 

Comme il n'y a pas des arguments de chaîne qui sont jointes à la requête que vous êtes en sécurité de toutes les injections SQL - il n'y a aucun moyen d'un nombre entier contient du code malveillant SQL.

L'approche habituelle lorsque le nombre d'ID est très important (de sorte que la requête échoue pendant la compilation pour être trop long) consiste à créer une table temporaire et à y insérer les ID. Une autre alternative consiste à transmettre les valeurs formatées en XML et, dans la requête SQL, à écrire une sous-sélection qui les extrait de la chaîne XML.

+1

Donc, il est préférable que je peux supprimer en utilisant linq aux entités plutôt de cette façon? pour éviter tout je l'ai utilisé. Aucune suggestion ? – Peru

+0

Je ne le fais généralement que lorsqu'il y a un grand nombre d'entités à supprimer. L'approche EF classique requiert un SELECT suivi de DELETE. Vous pouvez d'abord voir si 'Context.Tests.Local.FirstOrDefault (o => o.id == x)' renvoie 'null' (' .Local' ne contient que les objets déjà en mémoire) - sinon, supprimez en utilisant EF, sinon, supprimez directement dans SQL. –

Questions connexes