Использование 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)