Я экспериментирую с LINQ с некоторого времени. Типичный метод для перечисления в коллекции и изменения некоторых его свойств в моем коде будет выглядеть так:
ATDataContext dc = new ATDataContext(Settings.connection_string);
int[] col = ListViewClass.getListViewSelectedPositionTags(listView);
try
{
foreach (var item in col)
{
var ctx = (from r in dc.MailingLists
where r.ID == item
select r).Single();
ctx.Excluded = 'Y';
ctx.ExcludedComments = reason;
}
dc.SubmitChanges();
}
Некоторое время у меня есть совет, чтобы сделать это... кажется гораздо более умным способом:
var ctx = from r in dc.MailingLists
where col.Contains(r.ID)
select r;
foreach (var item in ctx)
{
item.Excluded = 'Y';
item.ExcludedComments = reason;
}
dc.SubmitChanges();
Iit имеет смысл на стольких уровнях, и я люблю это решение. Его умный и быстрый, чем первый.
Я использовал это решение в рабочей среде в течение некоторого времени.
Каково было мое удивление спустя несколько недель при поиске файлов журналов приложений и увидеть следующее:
"Протокол потока входящих вызовов (RPC) входящего потока табличных данных (TDS) неверен. В этом запросе RCP было предоставлено слишком много параметров. Максимум 2100.
LINQ to SQL преобразует предложение where col.Contains(r.ID)
в IN
, выглядя примерно так:
WHERE ID IN (@p1, @p1, @p2...)
Коллекция col
достигла (в моем случае) более 2100 элементов и запрос не смог выполнить. Я провел некоторое исследование проблемы, и я закончил:
"... Максимальное количество параметров в sql-запросе - 2100. Есть больше ограничений, например, тот факт, что вся строка запроса не может быть длиннее 8044 символов."
Мне так понравилось второе решение. Я настолько разочарован этими жестко закодированными ограничениями SQL Server.
Я что-то пропустил? Есть ли что-нибудь, что я могу сделать, чтобы использовать версию "where col.Contains(r.ID)"?
Отношения Мариуш
пс. (Я использую Win XP, С# с LINQ и SQL 2005 Express).