Miguel Moura:
Tengo una lista de enteros:
fue ids = nueva lista de {10, 20};
Y necesito encontrar usuarios con los identificadores que:
context.Users.FromSqlInterpolated($@"
select Users.*
where Users.Id in ({String.Join(',', ids)})"
Pero me sale el siguiente error:
'Conversion failed when converting the nvarchar value '10, 20' to data type int.'
¿Cómo puedo utilizar un parámetro tal?
Ivan Stoev:
Usando Interpolated
método no es apropiado aquí, porque {String.Join(',', ids)}
define sola cadena marcador de posición, por lo tanto, EF Core se une solo nvarchar
parámetro con valor '10,20'
, por lo que el SQL real es como este
select Users.*
where Users.Id in ('10,20')
que no es válido, por lo tanto, la excepción.
Debe utilizar Raw
el método en su lugar. Ya sea
var query = context.Users.FromSqlRaw($@"
select Users.*
where Users.Id in ({String.Join(',', ids)})");
que incrustar valores literales
select Users.*
where Users.Id in (10,20)
o si desea parametrizar, generar marcadores de posición de parámetros como {0}
, {1}
etc. dentro del SQL y pasar valores por separado:
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);
lo que generaría SQL como esto
select Users.*
where Users.Id in (@p0,@p1)