Последний (отсроченный); FirstMethod
- блок итератора (из-за yield return
); это означает, что у вас есть цепочка итераторов. Ничего не читается до тех пор, пока final вызывающий не начнет перебирать данные; затем каждая запись читается по очереди в течение финального звонящего *1006* foreach
(между которым соединение / команда открыта).
using
, окружающий foreach
(под капотом), гарантирует, что соединение закрыто, если foreach
был оставлен на полпути.
Если вы хотите загрузить данные раньше, используйте .ToList()
или .ToArray()
для локальной буферизации данных - но учтите, что это нарушает «композицию» - т.е. вызывающая сторона больше не может добавлять дополнительные 1019 * и т. Д. (Что они могут, если он возвращает необработанное IQueryable<T>
).
Ваш вопрос:
public IEnumerable<T> FirstMethod()
{
var entities = from t in context.Products
where {some conditions}
select t;
foreach( var entity in entities.AsEnumerable() )
{
entity.SomeProperty = {SomeValue};
yield return entity;
}
}
Ключ AsEnumerable
здесь; он завершает составную цепочку IQueryable<T>
и использует LINQ-to-Objects для остальных.