LINQ to SQL со слишком большим количеством записей для памяти - PullRequest
2 голосов
/ 17 декабря 2009

Большая часть LINQ to SQL, которую я делал, включает чтение данных из таблицы, а затем вызов метода расширения ToList () и использование данных в памяти. Однако теперь я хочу использовать LINQ to SQL для обработки большего количества записей, которые могут поместиться в памяти. Это шаблон, который я придумал до сих пор:

int skip = 0;
IList<Record> records = new List<Record>();
do
{
    records = DBRecords.Skip(skip).Take(1000).Select(a => new Record
    {
         // Set values here...
    }).ToList();
    foreach (Record r in records)
    {
        yield return r;
    }
    skip += 1000;
} while (records.Count > 0);

Это позволяет мне извлекать 1000 записей за раз и возвращать их партиями в приложение. Тем не менее, я знаю, что должен быть лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 17 декабря 2009

Поскольку вы пытаетесь просто вернуть IEnumerable, вы можете просто вернуть DBRecords - он все равно будет вычислен лениво. Однако, если вы сделаете это, следует опасаться, что доступ к вашей базе данных не начнется, пока вы не начнете оценивать IEnumerable. В зависимости от ваших обстоятельств это может сделать обработку исключений немного более сложной.

2 голосов
/ 17 декабря 2009

Зачем вам вообще нужно конвертировать в список? Весь смысл LINQ состоит в том, чтобы позволить ему возвращать вам данные при перечислении возвращаемого IEnumerable. Он должен внутренне позаботиться о считывании из базы данных нескольких записей одновременно.

2 голосов
/ 17 декабря 2009

linq вычисляется лениво, однако ToList () будет реализовывать весь результат. Вероятно, вы можете просто удалить ToList () и вернуть результат вашего запроса напрямую. Обработка результата в вызывающей стороне в блоке foreach будет выполняться лениво.

2 голосов
/ 17 декабря 2009

Почему вы не можете просто обрабатывать записи по одному в потоковом режиме?

foreach (Record record in query)
{
    // Do stuff...
}

Кроме того, какие вычисления вы делаете? Задумывались ли вы о том, возможно ли получить базу данных, чтобы выполнить расчеты за вас, и просто сообщить вам результат? Это может быть невозможно в вашей ситуации, но если это так, то это будет гораздо быстрее.

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