В этом случае важно различать IQueryable<T>
и IEnumerable<T>
.Вкратце IQueryable<T>
обрабатывается поставщиком LINQ для доставки оптимизированного запроса.Во время этого преобразования поддерживаются не все операторы C #, так как либо невозможно перевести их в специфичный для внутреннего интерфейса запрос (например, SQL), либо потому, что разработчик не предвидел необходимость этого оператора.
В отличие от этого IEnumerable<T>
выполняется против конкретных объектов и, следовательно, не будет трансформироваться.Таким образом, довольно часто конструкции, которые можно использовать с IEnumerable<T>
, нельзя использовать с IQueryable<T>
, а также что IQueryables<T>
, поддерживаемые различными поставщиками LINQ, не поддерживают один и тот же набор функций.Однако есть некоторые обходные пути (например, ответ Фила ), которые изменяют запрос.Кроме того, в качестве более общего подхода можно вернуться к IEnumerable<T>
, прежде чем продолжить спецификацию запроса.Это, однако, может привести к снижению производительности, особенно при использовании его в ограничениях (например, в предложениях where).Напротив, при работе с преобразованиями снижение производительности намного меньше, а иногда и вовсе отсутствует - в зависимости от вашего запроса.
Таким образом, приведенный выше код также можно переписать так:* ПРИМЕЧАНИЕ: Этот код окажет более сильное влияние на производительность, чем Ответ Фила .Тем не менее, это показывает принцип.