EF Core ExecuteSqlCommandAsync: преобразование не выполнено при преобразовании значения nvarchar '1,2' в тип данных int - PullRequest
0 голосов
/ 21 января 2019

Я выполняю выполнение raw sql, чтобы удалить некоторые записи, которые я добавил для теста.Если я выполняю тот же запрос в Management Studio, он работает нормально, но когда я выполняю этот запрос EF Core 2.0, он выдает ошибку ниже

System.Data.SqlClient.SqlException: 'Conversion failed when converting the nvarchar value '1,2' to data type int.'

Код

var idList = await Context.User.ToListAsync();
var ids = string.Join(",",idList.Select(x=>x.Id));
await _context.Database.ExecuteSqlCommandAsync($"Delete from User where Id in ({ids}) and RoleId = {contact.RoleId}");

Выполнение запроса Delete from sale.WatchList where OfferId in (1,2) and UserId = 9

Может кто-нибудь посоветовать, что не так с приведенным выше кодом.

Спасибо

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Это не будет работать.Вы должны написать динамический запрос.Пожалуйста, попробуйте, как показано ниже

var idList = await _dataContext.User.ToListAsync();
            var ids = string.Join(",", idList.Select(x => x.Id));
            await _dataContext.Database.ExecuteSqlCommandAsync($"execute('Delete from User where Id in ({ids}) and RoleId = {contact.RoleId}')");
0 голосов
/ 30 января 2019

хотя принятый ответ работает, он создает много предупреждений, поэтому сейчас я использую то, что @Abu Zafor предложил с небольшим изменением / исправлением

await _dataContext.Database.ExecuteSqlCommandAsync($"execute('Delete from User where Id in ({ids}) and RoleId = {contact.RoleId}')",ids,contact.RoleId);

0 голосов
/ 21 января 2019

EF Core преобразует интерполированные строки в запросы с параметрами для создания повторно используемых запросов и защиты от уязвимостей SQL-инъекций. См .: Необработанные SQL-запросы - EF Core - Передача параметров

So

$"Delete from User where Id in ({ids}) and RoleId = {contact.RoleId}"

превращается в

   Delete from User where Id in (@ids) and RoleId = @RoleId

С привязкой SqlParameters.

Если это не то, что вам нужно, просто создайте SQL-запрос на предыдущей строке.

...