Получение строк из таблицы SQL, соответствующих словарю, используя LINQ - PullRequest
0 голосов
/ 25 августа 2009

У меня есть следующий фрагмент кода:

    var matchingAuthors = from authors in DB.AuthorTable
                          where m_authors.Keys.Contains(authors.AuthorId)
                          select authors;

    foreach (AuthorTableEntry author in matchingAuthors)
    {
        ....
    }

, где m_authors - это словарь, содержащий записи "Автор", а DB.AuthorTable - это таблица SQL. Когда размер m_authors выходит за пределы определенного значения (где-то около отметки 3000 записей), я получаю исключение:

System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. 
Too many parameters were provided in this RPC request. The maximum is 2100.

Есть ли способ обойти это и работать со словарем большего размера? В качестве альтернативы, есть ли лучший способ получить все строки в таблице SQL, где конкретное значение столбца для этой строки соответствует одной из записей словаря?

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

LINQ to SQL использует параметризованный оператор IN для выполнения локального Contains():

...
WHERE AuthorId IN (@p0, @p1, @p2, ...)
...

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

  1. Выберите всю таблицу и отфильтруйте, используя LINQ to Objects.

  2. Создание дерева выражений из ваших ключей: см. Вариант 2 здесь .

0 голосов
/ 25 августа 2009

В зависимости от ваших требований, вы можете разбить работу на несколько меньших кусков (первая тысяча, вторая тысяча и т. Д.). Это создает определенные риски, если ваши данные читаются и записываются и часто изменяются, но это может дать вам немного лучшая масштабируемость, чем отрывание тысяч строк одним большим глотком. И, если ваши данные могут быть обработаны частично (то есть, не имея всего набора в памяти), вы можете отослать фрагменты для обработки в отдельном потоке, пока вы вытягиваете следующий фрагмент.

0 голосов
/ 25 августа 2009

Другим вариантом является рассмотрение того, как вы заполняете m_authors и можете ли вы включить его в запрос как сам элемент запроса, чтобы он превратился в соединение / выборку на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...