Uso gama de parámetro ints en consulta FromSQL y donde en la cláusula

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 Interpolatedmétodo no es apropiado aquí, porque {String.Join(',', ids)}define sola cadena marcador de posición, por lo tanto, EF Core se une solo nvarcharpará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 Rawel 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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=369097&siteId=1
Recomendado
Clasificación