Как параметризовать каскадные строковые запросы в Entity Framework Core - PullRequest
0 голосов
/ 09 марта 2019

В Entity Framework Core я могу параметризовать SQL-запрос следующим образом:

_context.Database.ExecuteSqlCommandAsync($"select * from table where id = {myid}");

где строка запроса SQL является FormattableString.

Мне нужно запустить обновление SQL для примерно 100 строк на ходу, и когда я использую Linq, это делает 100 обращений к базе данных, когда я мог бы легко сделать это, используя оператор SQL что-то вроде

UPDATE entity 
SET column = CASE .....

за один звонок. Но я не уверен, как это сделать для связанных строк.

Например:

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

Как я могу санировать или параметризировать этот запрос? Любая помощь будет оценена!

1 Ответ

1 голос
/ 09 марта 2019

Ваш первый пример - плохой способ параметризации вашего запроса, поскольку он открывает вас для внедрения SQL: Функция интерполированных строк в C # не настроена специально для команд SQL; он предназначен для различных применений и, следовательно, не реализует очистку SQL.

Вы всегда должны использовать класс SqlCommand и его свойство Parameters, чтобы обеспечить правильную очистку ваших параметров:

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.7.2#System_Data_SqlClient_SqlCommand_Parameters

Обновление: интерполированная строка неявно обрабатывается как команда SQL, а интерполанды очищаются при использовании этого конкретного конструктора в EF Core.

Однако в этом случае вам нужно будет построить строку, используя нотацию @ параметра, а затем заменить параметры, используя SqlCommand, чтобы убедиться, что они очищены, поскольку вы не можете представить запрос как один литерал шаблона.

Кроме того, если вам когда-либо понадобится объединить большое количество строк, + = - очень неэффективный способ сделать это, вы должны использовать StringBuilder вместо скорости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...