Каков наилучший способ написать запрос с предложением IN, используя Dapper ORM, если список значений для предложения IN исходит из бизнес-логики? Например, скажем, у меня есть запрос:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Это commaSeparatedListOfIDs
передается из бизнес-логики, и это может быть любой тип IEnumerable(of Integer)
. Как бы я построить запрос в этом случае? Нужно ли мне делать то, что я делал до сих пор, это в основном конкатенация строк или есть какая-то продвинутая техника отображения параметров, о которой я не знаю?
IN
предложении.Непосредственно с домашней страницы проекта GitHub :
Будет переведено на:
источник
Если ваше
IN
предложение слишком велико для MSSQL для обработки, вы можете довольно легко использовать TableValueParameter с Dapper.Создайте свой тип TVP в MSSQL:
Создайте
DataTable
столбец с теми же столбцами, что и TVP, и заполните его значениями.Измените ваш Dapper запрос, чтобы сделать его
INNER JOIN
в таблице TVP:Передайте DataTable в вашем вызове Dapper
Это также работает фантастически, когда вы хотите выполнить массовое обновление нескольких столбцов - просто создайте TVP и выполните
UPDATE
внутреннее соединение с TVP.источник
ProviderId
оMyTVP
томPRIMARY KEY CLUSTERED
, чтобы сделать это , поскольку это просто решило проблему производительности для нас (передаваемые нами значения не содержали дубликатов).Вот, пожалуй, самый быстрый способ запросить большое количество строк с помощью Dapper, используя список идентификаторов. Я обещаю вам, что это быстрее, чем любой другой способ, которым вы можете придумать (за возможным исключением использования TVP, как указано в другом ответе, и которое я не проверял, но я подозреваю, что может быть медленнее, потому что вам все еще нужно заполнить ТВП). Это планеты быстрее, чем Dapper с использованием
IN
синтаксиса, и юниверсы быстрее, чем Entity Framework строка за строкой. И это даже континенты быстрее, чем передать списокVALUES
илиUNION ALL SELECT
элементы. Его можно легко расширить, используя ключ из нескольких столбцов, просто добавив дополнительные столбцы вDataTable
таблицу temp и условия соединения.Имейте в виду, что вам нужно немного узнать о массовых вставках. Существуют варианты запуска триггеров (по умолчанию - нет), соблюдения ограничений, блокировки таблицы, разрешения одновременных вставок и т. Д.
источник
DataTable
Требуется для массовой вставки. Как вы вставить в таблицу темп 50000 значений?Также убедитесь, что вы не заключаете скобки в строку запроса следующим образом:
У меня была эта причина ошибки синтаксиса SQL с использованием Dapper 1.50.2, исправлена путем удаления скобок
источник
Это не нужно , чтобы добавить
()
в предложении WHERE , как мы делаем в обычном SQL. Потому что Даппер делает это автоматически для нас. Вот этоsyntax
: -источник
Пример для postgres:
источник
В моем случае я использовал это:
моя переменная "идентификаторы" во второй строке представляет собой IEnumerable из строк, также, я думаю, они могут быть целыми числами.
источник
List<string>
?По моему опыту, наиболее дружественный способ справиться с этим - иметь функцию, которая преобразует строку в таблицу значений.
В Интернете доступно множество функций разветвителя, и вы легко найдете их для любого вида SQL.
Затем вы можете сделать ...
Или
(Или похожие)
источник