J'ai récemment utilisé dapper et dans l'ensemble, il n'y avait pas de problèmes avec cela, sauf en utilisant des variables de table.
Pour démonstration, j'utilise un exemple modifié de ce thread .
Ce code fonctionne sans problèmes:
int tally = connection.Execute(
"create table #t(Name nvarchar(max), Age int)\n" +
"insert #t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Mais ce n'est pas le cas:
int tally = connection.Execute(
"create table @t(Name nvarchar(max), Age int)\n" +
"insert @t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Le seul changement est l'utilisation de variables de table à la place de tables temporaires ( @ instead #
). Dapper (ou autre chose dans la chaîne?) Semble en quelque sorte mélanger les paramètres et renvoie "Doit déclarer la variable de table @t
".
Y a-t-il quelque chose qui cloche dans mon utilisation ou est-ce une fonctionnalité de bogue / manquant dans dapper?
Cordialement, Kc
METTRE À JOUR:
Juste pour clarifier: @t
n'est pas un paramètre à définir par dapper. @t
est déclaré comme une table locale qui n'existe que pour la requête en cours d'exécution. À mon avis, Dapper ne devrait pas faire la distinction entre les types de tables, que ce soit une table "normale", une table temporaire locale / globale ou une variable de table.
Un peu plus d'informations de base:
Ce que je veux vraiment faire c'est:
Mon intention est de vaincre un problème de performance lors de la sélection de mes tables avec une clause WHERE IN (...)
Si vous utilisez SQL Server, la syntaxe est incorrecte. Dans SQL Server, les variables de table ne sont pas créées de la même manière que les tables normales. Ça devrait être comme ça:
DECLARE @t TABLE (
-- table definition
);