Ответ 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>
В этом случае первое не будет компилироваться.