Я уже давно использую Linq-to-SQL, и он прекрасно работает.Однако в последнее время я экспериментировал с его использованием для получения действительно больших объемов данных и сталкиваюсь с некоторыми проблемами.(Конечно, я понимаю, что L2S не может быть подходящим инструментом для этого конкретного вида обработки, но именно поэтому я экспериментирую - чтобы найти его пределы.)
Вот пример кода:
var buf = new StringBuilder();
var dc = new DataContext(AppSettings.ConnectionString);
var records = from a in dc.GetTable<MyReallyBigTable>() where a.State == "OH" select a;
var i = 0;
foreach (var record in records) {
buf.AppendLine(record.ID.ToString());
i += 1;
if (i > 3) {
break; // Takes forever...
}
}
Как только я начинаю перебирать данные, запрос выполняется как ожидалось.Проходя по коду, я сразу же вхожу в цикл, на который я и рассчитывал - это означает, что L2S, похоже, использует DataReader за кулисами вместо того, чтобы сначала извлекать все данные.Однако, как только я попадаю на break
, запрос продолжает выполняться и извлекает все остальные записи.Вот мои вопросы к SO-сообществу:
1.) Есть ли способ помешать Linq-to-SQL завершить выполнение действительно большого запроса в середине, как вы можете с помощью DataReader
?
2.) Если вы выполняете большой запрос Linq-to-SQL, существует ли способ предотвратить заполнение DataContext информацией отслеживания изменений для каждого возвращаемого объекта.По сути, вместо того, чтобы заполнять память, могу ли я выполнить большой запрос с короткими жизненными циклами объекта, как вы можете с помощью DataReader
методов?
Я в порядке, если это не встроенная функциональность DataContext
и требует расширения функциональности с некоторыми настройками.Я просто хочу использовать простоту и мощь Linq для больших запросов для ночных задач обработки вместо того, чтобы полагаться на T-SQL для всего.