Использовать массив массива ints в запросе From SQL и предложении Where In - PullRequest
0 голосов
/ 30 марта 2020

У меня есть список целых:

var ids = new List {10, 20};

И мне нужно найти пользователей с такими идентификаторами:

context.Users.FromSqlInterpolated($@" 
  select Users.* 
  where Users.Id in ({String.Join(',', ids)})"

Но я получаю следующую ошибку:

'Conversion failed when converting the nvarchar value '10, 20' to data type int.'

Как я могу использовать такой параметр?

1 Ответ

1 голос
/ 30 марта 2020

Использование Interpolated метода здесь не подходит, потому что {String.Join(',', ids)} определяет заполнитель из одной строки, следовательно, EF Core связывает один nvarchar параметр со значением '10,20', поэтому фактический SQL похож на

select Users.* 
where Users.Id in ('10,20')

, что недопустимо, следовательно, исключение.

Вместо этого следует использовать метод Raw. Либо

var query = context.Users.FromSqlRaw($@" 
select Users.* 
where Users.Id in ({String.Join(',', ids)})");

, в который будут вставлены буквенные значения

select Users.* 
where Users.Id in (10,20)

, либо, если вы хотите его параметризовать, сгенерируйте заполнители параметров, такие как {0}, {1} et c. внутри SQL и передать значения отдельно:

var placeholders = string.Join(",", Enumerable.Range(0, ids.Count)
    .Select(i => "{" + i + "}"));
var values = ids.Cast<object>().ToArray();

var query = context.Users.FromSqlRaw($@" 
select Users.* 
where Users.Id in ({placeholders})", values);

, что сгенерирует SQL вот так

select Users.* 
where Users.Id in (@p0,@p1)
...