Загружает ли он данные из базы данных? - PullRequest
4 голосов
/ 27 января 2009

Предположим, у нас есть такой метод:

public IEnumerable<T> FirstMethod()
{
    var entities = from t in context.Products
                   where {some conditions}
                   select t;

    foreach( var entity in entities )
    {
        entity.SomeProperty = {SomeValue};
        yield return entity;   
    }
}

где context - это DataContext, сгенерированный конструктором Linq to SQL.

«FirstMethod» загружает данные в память из базы данных (из-за цикла foreach) или будет по-прежнему откладывать загрузку до тех пор, пока другой цикл foreach, не имеющий «yield return», не будет найден в другом методе, подобном следующему

public void SecondMethod()
{
    foreach( var item in FirstMethod() )
    {
        {Do Something}
    }
}

Ответы [ 3 ]

6 голосов
/ 27 января 2009

Последний (отсроченный); 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 для остальных.

2 голосов
/ 27 января 2009

Короче говоря, он не загружается, пока SecondMethod не выполнит итерацию ...

Читайте здесь , чтобы узнать больше ...

1 голос
/ 27 января 2009

Загрузка откладывается до тех пор, пока метод GetEnumerator не будет вызван для запроса entity , и это не произойдет, пока метод GetEnumerator не будет вызван для IEnumerable вы возвращаетесь.

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