¿Cuál es la mejor manera de escribir una consulta con cláusula IN utilizando Dapper ORM cuando la lista de valores para la cláusula IN proviene de la lógica empresarial? Por ejemplo, digamos que tengo una consulta:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
El commaSeparatedListOfIDs
se pasa de la lógica de negocios y puede ser cualquier tipo de IEnumerable(of Integer)
. ¿Cómo construiría una consulta en este caso? ¿Tengo que hacer lo que he estado haciendo hasta ahora, que es básicamente la concatenación de cadenas o hay algún tipo de técnica avanzada de mapeo de parámetros que no conozco?
IN
cláusula.Directamente desde la página de inicio del proyecto GitHub :
Será traducido a:
fuente
Si su
IN
cláusula es demasiado grande para que la maneje MSSQL, puede usar un TableValueParameter con Dapper con bastante facilidad.Cree su tipo de TVP en MSSQL:
Cree un
DataTable
con las mismas columnas que el TVP y complételo con valoresModifique su consulta Dapper para hacer un
INNER JOIN
en la tabla TVP:Pase la DataTable en su llamada de consulta Dapper
Esto también funciona fantásticamente cuando desea hacer una actualización masiva de varias columnas: simplemente construya un TVP y realice una
UPDATE
unión interna al TVP.fuente
ProviderId
onMyTVP
bePRIMARY KEY CLUSTERED
, ya que esto solo resolvió un problema de rendimiento para nosotros (los valores que pasábamos no contenían duplicados).Esta es posiblemente la forma más rápida de consultar una gran cantidad de filas con Dapper utilizando una lista de ID. Te prometo que esto es más rápido que casi cualquier otra forma en que puedas pensar (con la posible excepción de usar un TVP como se indica en otra respuesta, y que no he probado, pero sospecho que puede ser más lento porque todavía tienes que llenar El TVP). Es planetas más rápido que Dapper usando
IN
sintaxis y universos más rápido que Entity Framework fila por fila. Y es aún más rápido de lo que pasa continentes en una lista deVALUES
oUNION ALL SELECT
artículos. Se puede ampliar fácilmente para usar una clave de varias columnas, solo agregue las columnas adicionales a laDataTable
tabla temporal y las condiciones de unión.Tenga en cuenta que necesita aprender un poco sobre las inserciones masivas. Hay opciones para disparar disparadores (el valor predeterminado es no), respetar las restricciones, bloquear la tabla, permitir inserciones concurrentes, etc.
fuente
DataTable
requiere para el inserto a granel. ¿Cómo se inserta a la tabla temporal 50.000 valores?También asegúrese de no colocar paréntesis alrededor de su cadena de consulta de la siguiente manera:
Esto causó un error de sintaxis SQL al usar Dapper 1.50.2, solucionado eliminando paréntesis
fuente
No es necesario agregar
()
la cláusula WHERE como lo hacemos en un SQL normal. Porque Dapper hace eso automáticamente por nosotros. Aquí está elsyntax
: -fuente
Ejemplo para postgres:
fuente
En mi caso, he usado esto:
mis "identificadores" variables en la segunda línea son un IEnumerable de cadenas, también pueden ser enteros, supongo.
fuente
List<string>
?En mi experiencia, la forma más amigable de lidiar con esto es tener una función que convierta una cadena en una tabla de valores.
Hay muchas funciones de división disponibles en la web, encontrará fácilmente una para lo que sea, si su sabor de SQL.
Entonces puedes hacer ...
O
(O similar)
fuente