Ответ 1
myEnumerable.AsQueryable()
возвращает пользовательский объект: new EnumerableQuery<TElement>(myEnumerable);
(исходный код)
Этот класс EnumerableQuery
реализует IEnumerable<T>
и IQueryable<T>
При использовании результата EnumerableQuery
.AsQueryable()
в качестве IEnumerable
реализация метода интерфейса IEnumerable<T>.GetIterator()
просто возвращает исходный итератор исходного кода, поэтому никаких изменений и минимальных издержек не происходит.
При использовании результата .AsQueryable()
в качестве IQueriable
реализация свойства интерфейса IQueriable.Expression
просто возвращает Expression.Constant(this)
, готовый к оценке позже как IEnumerable, когда потребляется все дерево выражений.
(Все остальные методы и пути кода EnumerableQuery
на самом деле не актуальны, когда EnumerableQuery сконструирован непосредственно из IEnumerable, насколько я могу судить)
Если вы правильно поняли, вы внедрили свой метод selectDynamic<TResult>()
таким образом, чтобы вы построили дерево выражений внутри метода, что при компиляции дает желаемый результат.
Насколько я понимаю исходный код, когда вы звоните, например. myEnumerable.AsEnumerable().selectDynamic().ToList()
, созданное вами дерево выражений компилируется и выполняется на myEnumerable, и суммарные накладные расходы должны быть довольно минимальными, так как вся эта работа выполняется только один раз для каждого запроса, а не один раз для каждого элемента.
Итак, я думаю, что нет ничего плохого в реализации вашего метода IEnumerable Extension, например:
public IEnumerable<TResult> SelectDynamic<TResult>(
this IEnumerable<T> source,...)
return source.AsQueryable().SelectDynamic();
}
Есть некоторые небольшие накладные расходы, так как это компилирует запрос один раз при каждом вызове этого метода, и я не уверен, что JITer достаточно умен, чтобы кэшировать эту компиляцию. Но я думаю, что это не будет заметно в большинстве случаев, если вы не выполните этот запрос тысячу раз в секунду.
В реализации метода расширения IEnumerable не должно быть никаких других побочных эффектов, помимо небольших проблем с производительностью.