Первый не работает, потому что когда метод возвращает контекст данных, экземпляр которого создан в блоке using
, он удаляется. Тем не менее, возвращаемый IEnumerable<BatchHeader>
лениво оценивается и нуждается в живом контексте данных для перечисления его результатов.
Вы можете сделать что-то вроде этого:
public IEnumerable<BatchHeader> GetHeaders() {
using(NSFChecksDataContext context = DataContext) {
foreach(var header in context.BatchHeaders) {
yield return header;
}
}
}
Второй блок работает, потому что результаты запроса перечисляются и сохраняются в памяти перед удалением контекста данных. После этого контекст данных больше не нужен. Однако будьте осторожны при использовании кода, подобного вашему второму блоку; если таблица BatchHeaders
велика, вы просто вытягиваете все это в память.
Теперь и вот самая серьезная часть моего ответа: Я абсолютно не могу видеть запросы, которые создают экземпляры контекстов данных для выполнения. Я хочу знать и контролировать, когда мои контексты данных используются.