IEnumerable <T> и IQueryable <T> разъяснение?

После прочтения этого вопроса, Мне нужно прояснить некоторые вещи.

IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

Вопросы:

1) Можно ли сказать, что: в первом запросе SQLServer запускает всю операцию, включая предложение where и возвращает ТОЛЬКО соответствующие строки, а второй - SELECT *. и возвращает все строки в фильтры С# и THEN?

2) Как насчет того, если у меня есть коллекция просто - в памяти. (var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>"
select c;

против

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>"
select c;

какова будет разница в исполнении?

Ответ 1

1: Нет, это неверно

Поскольку вы сохраняете результат только в IEnumerable<Customer>, но все равно имеете то же самое выражение, которое производит результат, они будут выполняться на сервере и возвращать только соответствующие строки.

Вы получите разницу в поведении с этим:

IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers
    where c. City == "<City>"
    select c;

В этом случае вы заставляете коллекцию db.Customers использоваться как IEnumerable<T>, которая при перечислении будет извлекать всю коллекцию.

Обратите внимание, что это:

IEnumerable<Customer> x = from c in db.Customers
                          where c.City == "<City>"
                          select c;

не совпадает с этим:

IEnumerable<Customer> x = from c in db.Customers
                          select c;
IEnumerable<Customer> y = x.Where(c => c.City == "<City>");

В первом случае предложение where будет частью SQL, во втором - нет. Вот почему связанный вопрос/ответ вовлекает разницу, в то время как ваш код не делает.

Также обратите внимание, что только написанные вами инструкции на самом деле ничего не будут выполнять на сервере, так как они будут эффективно хранить только ленивую коллекцию. Если вы перейдете и перечислите эти коллекции, в этот момент соответствующие бит будут выполняться на сервере.

2: List<T> не реализует или не использует методы расширения для IQueryable<T>, и не будут задействованы операторы LINQ, совместимые с IQueryable<T>

В этом случае первое не будет компилироваться.