2009-12-16 3 views
2

Многие из LINQ to SQL, которые я делал, включают чтение данных из таблицы, а затем вызов метода расширения ToList() и использование данных в памяти. Однако теперь я хочу использовать LINQ to SQL для обработки большего количества записей, которые могут вписываться в память. Это шаблон, который я придумал до сих пор: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 записей в то время, и вернуть их в пакетном режиме в приложении. Однако я знаю, что должен быть лучший способ сделать это?

+0

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

ответ

2

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

2

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

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

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

2

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

2

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

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