2009-08-24 2 views
0

У меня есть следующий фрагмент кода:Получения строк из таблицы SQL, соответствующих словарь с помощью LINQ

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, где конкретное значение столбца для этой строки соответствует одной из записей словаря?

ответ

2

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

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

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

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

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

0

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

0

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

Смежные вопросы