Во время компиляции операторы 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);
Другие вопросы по тегам