Qual é a melhor maneira de escrever uma consulta com a cláusula IN usando o Dapper ORM quando a lista de valores da cláusula IN vem da lógica de negócios? Por exemplo, digamos que eu tenho uma consulta:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
O commaSeparatedListOfIDs
está sendo transmitido da lógica de negócios e pode ser de qualquer tipo IEnumerable(of Integer)
. Como eu construiria uma consulta neste caso? Preciso fazer o que venho fazendo até agora, que é basicamente concatenação de strings ou existe algum tipo de técnica avançada de mapeamento de parâmetros que eu não conheço?
IN
cláusula.Diretamente da página inicial do projeto GitHub :
Será traduzido para:
fonte
Se sua
IN
cláusula for muito grande para o MSSQL manipular, você poderá usar um TableValueParameter com Dapper com bastante facilidade.Crie seu tipo de TVP no MSSQL:
Crie um
DataTable
com as mesmas colunas que o TVP e preencha-o com valoresModifique sua consulta Dapper para fazer um
INNER JOIN
na tabela TVP:Passe o DataTable na sua chamada de consulta do Dapper
Isso também funciona de maneira fantástica quando você deseja fazer uma atualização em massa de várias colunas - basta criar um TVP e fazer uma
UPDATE
junção interna ao TVP.fonte
ProviderId
em fazer noMyTVP
bePRIMARY KEY CLUSTERED
, pois isso acabou de resolver um problema de desempenho para nós (os valores que estávamos passando não continham duplicatas).Esta é possivelmente a maneira mais rápida de consultar um grande número de linhas com o Dapper usando uma lista de IDs. Eu prometo a você que isso é mais rápido do que quase qualquer outra maneira em que você possa pensar (com a possível exceção de usar um TVP como dado em outra resposta, e que eu não testei, mas suspeito que possa ser mais lento porque você ainda precisa preencher TVP). É planetas mais rápido que o Dapper usando
IN
sintaxe e universos mais rápido que o Entity Framework linha por linha. E é até continentes mais rápido do que passar em uma lista deVALUES
ouUNION ALL SELECT
itens. Ele pode ser facilmente estendido para usar uma chave de várias colunas, basta adicionar as colunas extras àsDataTable
, tabela temporária e condições de junção.Esteja ciente de que você precisa aprender um pouco sobre as inserções em massa. Existem opções sobre acionar acionadores (o padrão é não), respeitar restrições, bloquear a tabela, permitir inserções simultâneas e assim por diante.
fonte
DataTable
é necessária para a inserção em massa. Como você insere na tabela temporária 50.000 valores?Além disso, certifique-se de não colocar parênteses em torno da string de consulta da seguinte maneira:
Eu tive essa causa um erro de sintaxe SQL usando o Dapper 1.50.2, corrigido pela remoção de parênteses
fonte
Não é necessário adicionar
()
a cláusula WHERE como fazemos em um SQL regular. Porque Dapper faz isso automaticamente para nós. Aqui está osyntax
: -fonte
Exemplo para postgres:
fonte
No meu caso, eu usei isso:
minha variável "ids" na segunda linha é um IEnumerable de strings, também podem ser números inteiros, eu acho.
fonte
List<string>
?Na minha experiência, a maneira mais amigável de lidar com isso é ter uma função que converta uma string em uma tabela de valores.
Existem muitas funções divisoras disponíveis na web; você encontrará facilmente uma para qualquer que seja o seu sabor de SQL.
Você pode fazer ...
Ou
(Ou similar)
fonte