Как поставить v. Большие предложения WHERE, используя dapper - PullRequest
0 голосов
/ 15 ноября 2018

Я изо всех сил пытаюсь найти ответы в Интернете на этот вопрос, так что извините за недостаток исследований, я перешел прямо к вопросу под рукой.

Я создаю следующий запрос в C # с помощью dapper;

SELECT BookName
FROM dbo.Books
WHERE {predicates}

В настоящее время у меня есть частная функция, которая берет список значений ключа из столбца и значения и преобразует его в наборгде пункты.Например;

var searchTerms = new List<KeyValuePair<string, string>>{
    new KeyValuePair("ReferenceId", "42"),
    new KeyValuePair("AuthorId", "1")
};

Это будет преобразовано в;

SELECT BookName
FROM dbo.Books
WHERE ReferenceId = 41
AND AuthorId = 1

Так что это работает, и все в порядке.

Проблема под рукой

Пользователь может и ввел в пользовательский интерфейс 10 000 идентификаторов.Пользовательский интерфейс и сервер не имеют проблем с обработкой этого, но SQL-сервер меня не устраивает, я получаю следующее:

Входящий запрос имеет слишком много параметров.Сервер поддерживает максимум 2100 параметров.Уменьшите количество параметров и повторно отправьте запрос

Теперь я знал, что это ограничение существует, и я также знаю, что ограничение существует при использовании оператора IN.Вопрос в том, как мне обойти это?

Моей первой мыслью было передать json и изменить запрос на что-то вроде этого;

SELECT BookName
FROM dbo.Books
WHERE ReferenceId IN (
    SELECT UpcId FROM OPENJSON(@json) WITH(UpcId bigint '$')
)

КакНасколько я могу судить, это решение будет работать, но с учетом моего исходного сценария, что если пользователь вставит 10 000 идентификаторов авторов.

Я ожидаю, что по крайней мере один ответ будет "Просто ваш запрос", и яХотелось бы, чтобы это было возможно.Мы говорим о 13-миллионной таблице строк с 20+ столбцами, большинство из которых важны для кого-то.

Элегантное решение, которое я хотел бы ...

В идеале, и я не уверенесли это возможно ...

Я бы очень хотел передать данные как json и заполнить следующую объявленную таблицу:

DECLARE @booksToFind TABLE (Column nvarchar(max), Value nvarchar(max))

Теперь я знаю, как заполнить эту таблицу, ноЯ абсолютно не представляю, можно ли создать запрос для использования этих значений в качестве столбцов и создать эквивалентное предложение where в элегантном запросе!

...