Utilisez le paramètre TVP (Table Valued Parameter) au lieu de «where in»

c# dapper

Question

Code comme ceci :

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

échoue lorsque listOfIds est trop long. Vous obtiendrez quelque chose dans ce sens:

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

(en fonction de vos rdbms)

Idéalement, je voudrais utiliser un paramètre de valeur de table. Je n'ai pas encore trouvé de bon exemple. Quelqu'un pourrait-il me diriger dans la bonne direction?

Réponse acceptée

Cela devrait aider:

// 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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi