Quelle est la meilleure façon d'écrire une requête avec la clause IN à l'aide de Dapper ORM lorsque la liste des valeurs de la clause IN provient de la logique métier? Par exemple, disons que j'ai une requête:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Le commaSeparatedListOfIDs
est transmis à partir de la logique métier et il peut s'agir de n'importe quel type de IEnumerable(of Integer)
. Comment pourrais-je construire une requête dans ce cas? Dois-je faire ce que j'ai fait jusqu'à présent, qui est essentiellement une concaténation de chaînes ou existe-t-il une sorte de technique avancée de mappage de paramètres que je ne connais pas?
IN
clause.Directement depuis la page d'accueil du projet GitHub :
Sera traduit en:
la source
Si votre
IN
clause est trop volumineuse pour être traitée par MSSQL, vous pouvez utiliser un TableValueParameter avec Dapper assez facilement.Créez votre type TVP dans MSSQL:
Créez un
DataTable
avec la même colonne (s) que le TVP et remplissez-le avec des valeursModifiez votre requête Dapper pour faire une
INNER JOIN
sur la table TVP:Passer le DataTable dans votre appel de requête Dapper
Cela fonctionne également de manière fantastique lorsque vous souhaitez effectuer une mise à jour en masse de plusieurs colonnes - créez simplement un TVP et effectuez une
UPDATE
avec une jointure interne au TVP.la source
ProviderId
leMyTVP
êtrePRIMARY KEY CLUSTERED
, comme cela vient de résoudre un problème de performance pour nous (les valeurs que nous passions devant CONTENUES pas de doublons).Voici probablement le moyen le plus rapide d'interroger un grand nombre de lignes avec Dapper à l'aide d'une liste d'ID. Je vous promets que c'est plus rapide que presque toutes les autres façons auxquelles vous pouvez penser (à l'exception possible de l'utilisation d'un TVP comme indiqué dans une autre réponse, et que je n'ai pas testé, mais je soupçonne qu'il peut être plus lent car vous devez encore remplir le TVP). Il s'agit de planètes plus rapides que Dapper utilisant la
IN
syntaxe et les univers plus rapidement que Entity Framework ligne par ligne. Et c'est même des continents plus rapides que de passer dans une liste deVALUES
ou desUNION ALL SELECT
éléments. Il peut facilement être étendu pour utiliser une clé multi-colonnes, il suffit d'ajouter les colonnes supplémentaires à laDataTable
, la table temporaire et les conditions de jointure.Sachez que vous devez en apprendre un peu plus sur les inserts en vrac. Il existe des options concernant le déclenchement des déclencheurs (la valeur par défaut est no), le respect des contraintes, le verrouillage de la table, l'autorisation des insertions simultanées, etc.
la source
DataTable
est requis pour l'insert en vrac. Comment insérez- vous dans la table temporaire 50 000 valeurs?Assurez-vous également de ne pas placer de parenthèses autour de votre chaîne de requête comme ceci:
J'ai eu cette cause une erreur de syntaxe SQL en utilisant Dapper 1.50.2, corrigée en supprimant les parenthèses
la source
Il n'est pas nécessaire d'ajouter
()
la clause WHERE comme nous le faisons dans un SQL standard. Parce que Dapper le fait automatiquement pour nous. Voici lesyntax
: -la source
Exemple pour postgres:
la source
Dans mon cas, j'ai utilisé ceci:
ma variable "ids" dans la deuxième ligne est un IEnumerable de chaînes, elles peuvent aussi être des entiers je suppose.
la source
List<string>
?D'après mon expérience, la façon la plus conviviale de gérer cela est d'avoir une fonction qui convertit une chaîne en une table de valeurs.
Il existe de nombreuses fonctions de séparation disponibles sur le Web, vous en trouverez facilement une pour votre goût de SQL.
Vous pouvez alors faire ...
Ou
(Ou similaire)
la source