Linq2Sql: Как управлять большими наборами результатов? - PullRequest
0 голосов
/ 30 июня 2010

Допустим, у меня есть запрос с очень большим набором результатов (+100 000 строк), и мне нужно перебрать и выполнить обновление:

var ds = context.Where(/* query */).Select(e => new { /* fields */ } );

foreach(var d in ds)
{
//perform update
}

Я в порядке, этот процесс занимает много времени, но у меня ограниченный объем памяти на моем сервере.

Что происходит в foreach? Получается ли весь результат сразу из базы данных?

Было бы лучше использовать Skip and Take для обновления по частям?

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Вы в основном злоупотребляете LINQ2SQL - не для этого.

  • Все результаты загружаются в память.
  • Ваши изменения записываются один раз, после того, как вы закончите.

Это будет медленно, и это будет - хм - использование тонны памяти.Учитывая ограниченный объем памяти - невозможно.

НЕ загружать все данные одновременно.Попробуйте выполнить несколько запросов с частичными наборами результатов (1000-2500 элементов каждый).

ORM не предназначены для массовых манипуляций.

1 голос
/ 30 июня 2010

Не могли бы вы использовать хранимую процедуру для обновления всего за один раз?

1 голос
/ 30 июня 2010

Лучший способ - использовать Skip and Take yes и убедиться, что после каждого обновления вы утилизируете DataContext (используя «using»)

Вы можете проверить мой вопрос, похожая проблема с хорошим решением: Недостаточно памяти при создании большого количества объектов C #

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