Это не микро оптимизации, чтобы провести различие между Linq-To-Sql и Linq-To-Objects. Последнее требует, чтобы все данные загружались в память, прежде чем вы начнете ее фильтровать. Конечно, это может быть серьезной проблемой.
Большинство методов LINQ используют отложенное выполнение, что означает, что он просто строит запрос но это еще не выполнено (например, Select
или Where
). Немногие другие выполняют запрос и материализуют результат в коллекцию в памяти (например, ToLIst
или ToArray
). Если вы используете AsEnumerable
, вы также используете Linq-To-Objects
, и после него не генерируется SQL для частей после него, а это значит, что данные должны быть загружены в память (но все еще используются отложенное выполнение).
Итак, рассмотрите следующие два запроса. Первые выбирает и фильтры в базе данных:
var queryLondonCustomers = from cust in db.customers
where cust.City == "London"
select cust;
а второй выбирает все и фильтры через Linq-To-Objects
:
var queryLondonCustomers = from cust in db.customers.AsEnumerable()
where cust.City == "London"
select cust;
Последняя имеет одно преимущество: вы можете использовать любой метод .NET, поскольку он Безразлично» t необходимо перевести на SQL (например, !String.IsNullOrWhiteSpace(cust.City)
).
Если вы только что получили то, что является IEnumerable<T>
, вы не можете быть уверены, что это фактически запрос или уже объект в памяти. Даже try-cast до IQueryable<T>
не скажет вам точно, что это на самом деле из-за AsQueryable
-method. Может быть, вы можете попробовать применить его к типу коллекции. Если бросок преуспевает, вы можете быть уверены, что это уже материализовались, но в противном случае он не скажет вам, если он использует Linq-To-Sql
или Linq-To-Objects
:
bool isMaterialized = queryLondonCustomers as ICollection<Customer> != null;
по теме: EF ICollection Vs List Vs IEnumerable Vs IQueryable
Ну, а не LINQ to SQL и LINQ для объектов ... но обычно, если вы имеют 'IEnumerable', операции будут использовать LINQ to Objects, но если у вас есть 'IQueryable ', операции будут использовать «что-то еще». (Конечно, 'AsQueryable' будет обертывать' IEnumerable 'в' IQueryable ', так что это не 100% ...) Что вы действительно ищете? –
Если это 'IQueryable', относитесь к нему с осторожностью. Вы всегда можете использовать 'AsEnumerable()' для выбора обработки в памяти, но вы должны знать о последствиях (загрузка всех данных в память). – haim770
«если у вас есть IQueryable, операции будут использовать« что-то еще » Что-нибудь еще? И как вы можете точно знать? Ожидаем ли мы, что компьютер будет обрабатывать все эти вещи без нашего полного понимания? –