Возврат IEnumerable при запросе метода с использованием IQueryable - PullRequest
4 голосов
/ 23 мая 2011

Если у вас есть метод, который возвращает IEnumerable, но внутри возвращает IQueryable, вернет ли IEnumerable принудительное выполнение, даже если IQueryable задерживает выполнение?

public IEnumerable<Customer> Customers()
{
    IEnumerable<Customer> customers = null;

try
{
    customers = from c in GetCustomers // IQueryable
            where c.Name=="JO"
            select c;
    }
    catch (SqlException ex)
    {
    }
    return customers;
}

Ответы [ 5 ]

3 голосов
/ 23 мая 2011

Результат, который вы вернете, будет перечисляемым и будет откладывать выполнение до тех пор, пока вы не начнете перечислять его.Однако, в отличие от IQueryable, он не будет изменен какими-либо дальнейшими операциями над ним.

Например, если после этого вы сделали что-то вроде .Sum(), оно будет выполнено на локальной машине, тогда как IQueryableможет отправить Sum() в удаленную базу данных или веб-службу.

1 голос
/ 23 мая 2011

Во-первых, IQueryable<T> реализует IEnumerable<T>, так что вы на самом деле ничего не "заставляете" здесь, поскольку IQueryable<T> будет просто возвращено, оценка не требуется.

Во-вторых, IEnumerable<T>обычно также оценивается лениво (через .ToArray(), .ToList(), foreach() и т. д.)

1 голос
/ 23 мая 2011

Поскольку IQueryable реализует IEnumerable, при возврате объекта вы ничего не будете форсировать.

0 голосов
/ 23 мая 2011

Вы не будете форсировать выполнение, так как IQueryable и IEnumerable лениво оцениваются, а IQueryable реализует IEnumerable, поэтому никакого преобразования не требуется.

Это на самом деле создает проблему, если ваша архитектура плохо настроена для этого случая - возвращенный IQueryable выполняет запрос только после оценки результатов (т. Е. Когда вы повторяете результаты). Если соединение с БД в этот момент было закрыто, вы получите исключение.

0 голосов
/ 23 мая 2011

Вы не будете принудительно исполнять, пока не выполните одно из следующих действий (но не ограничивайтесь ими):

  • ToList()
  • FirstOrDefault()

Код не выполняется до тех пор, пока сбор не потребуется физически;например, в качестве источника данных.

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