Во время компиляции операторы Linq-To-Objects также переводятся в объекты дерева выражений?
Во время компиляции операторы LINQ, которые работают на IQueryable<T>
(таким образом, операторы Linq-to-SQL и Linq-to-Entities) переводятся в объекты дерева выражений, которые представляют код в виде данных.
а) Делать операторы LINQ, которые работают на IEnumerable<T>
(таким образом, LINQ-to-Objects) также переводятся в деревья выражений?
б) Если нет, что происходит с операторами LINQ-to-Object во время компиляции? Компилятор просто переводит их в соответствующие вызовы методов? Например, следующий оператор Linq-to-Objects:
var results = collection.Select(item => item.id).Where(id => id > 10);
переведено компилятором в нечто похожее на следующее:
var results = Enumerable.Where(
Enumerable.Select(collection, item => item.id),
id => id > 10
);
благодарю вас
1 ответ
Если вы отражаете код, методы расширения IEnumerable фактически содержат реализацию того, что вы пытаетесь сделать. Если вы хотите построить сборку дерева выражений, просто включите метод расширения AsQueryable() в начале, чтобы ваш запрос стал:
var results = collection.AsQueryable().Select(item => item.id).Where(id => id > 10);