Use el parámetro de valor de tabla (TVP) en lugar de 'where in'

c# dapper

Pregunta

Código como este :

connection.Execute("delete from Table where ID in @ids", new { ids=listOfIds });

falla cuando listOfIds es demasiado largo. Obtendrás algo en esa línea:

The incoming request has too many parameters. The server supports a maximum of 2100

(según tus rdbms)

Idealmente, me gustaría usar un parámetro de valor de tabla. Todavía estoy por encontrar un ejemplo digno decente. ¿Podría alguien señalarme en la dirección correcta?

Respuesta aceptada

Esto debería ayudar:

// 1. declare the custom data type
// this is just to make it re-runnable; normally you only do this once
try { connection.Execute("drop type MyIdList"); } catch { }
connection.Execute("create type MyIdList as table(id int);");

// 2. prepare the data; if this isn't a sproc, also set the type name
DataTable ids = new DataTable {
    Columns = {{"id", typeof(int)}},
    Rows = {{1},{3},{5}}
};
ids.SetTypeName("MyIdList");

// 3. run the query, referencing the TVP (note @tmp represents the db data)
int sum = connection.Query<int>(@"
-- spoof some data
declare @tmp table(id int not null);
insert @tmp (id) values(1), (2), (3), (4), (5), (6), (7);
-- the actual query
select * from @tmp t inner join @ids i on i.id = t.id", new { ids }).Sum();
sum.IsEqualTo(9); // just checks the result


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué