In Entity Framework Core, posso parametrizzare una query SQL in questo modo:
_context.Database.ExecuteSqlCommandAsync($"select * from table where id = {myid}");
dove la stringa di query SQL è un FormattableString
.
Ho bisogno di eseguire un aggiornamento SQL per circa 100 righe alla volta e quando uso Linq, questo fa 100 chiamate al database, quando potrei facilmente farlo usando un'istruzione SQL qualcosa come
UPDATE entity
SET column = CASE .....
in una sola chiamata. Ma non sono sicuro di come procedere per stringhe concatenate.
Per esempio:
string sqlQuery = "UPDATE entity SET column = CASE "
for(int i = 0; i < 10; i++){
sqlQuery += "WHEN column2 = i THEN i + 1 ";
}
sqlQuery += "WHERE id IN (1,2,3,4,5,6,7,8,9,10)";
await _context.Database.ExecuteSqlCommandAsync(sqlQuery);
Come posso disinfettare o parametrizzare questa query? Qualsiasi aiuto sarà apprezzato!
Il tuo primo esempio è un brutto modo di parametrizzare la tua query mentre ti apre all'iniezione SQL: la funzione di stringhe interpolate in C # non è impostata specificamente per i comandi SQL; è destinato ad avere una varietà di usi e quindi non implementa la sanificazione SQL.
Utilizzare sempre la classe SqlCommand
e la sua proprietà Parameters
per assicurarsi che i parametri siano disinfettati correttamente:
Aggiornamento: la stringa interpolata viene implicitamente trattata come un comando SQL e gli interpolandi vengono disinfettati quando si utilizza quello specifico costruttore in EF Core.
Tuttavia, in questo caso, dovrai costruire la tua stringa usando la notazione @ parametro e quindi sostituire i parametri usando SqlCommand
per assicurarti che siano disinfettati, dal momento che non puoi rappresentare la query come un singolo modello letterale.
Inoltre, se hai mai bisogno di concatenare un gran numero di stringhe, + = è un modo molto inefficiente per farlo, dovresti usare StringBuilder
invece per la velocità.