Проблема с использованием оператора соединения в лямбда-выражении и дереве выражений

Я пишу этот метод:

public List<TResult2> SelectAndJoin<TOuter, TInner, TKey, TResult, TResult2>(IEnumerable<TInner> inner, 
                                                                      System.Linq.Expressions.Expression<Func<Regions, TKey>> outerKeySelector, 
                                                                      System.Linq.Expressions.Expression<Func<TInner, TKey>> innerKeySelector, 
                                                                      System.Linq.Expressions.Expression<Func<Regions, TInner, TResult>> resultSelector,
                                                                      Func<Regions, TResult2> selector)
    {
        using (RepositoryDataContext = new DataClasses1DataContext())
        {
                return RepositoryDataContext.Regions.Join(inner, outerKeySelector, innerKeySelector, resultSelector).AsEnumerable<TResult2>().Select<Regions, TResult2>(selector).ToList<TResult2>();

        }
    }

но выражение после возврата имеет эту ошибку:

«System.Linq.IQueryable» не содержит определения для «AsEnumerable», а лучшая перегрузка метода расширения «System.Linq.Enumerable.AsEnumerable (System.Collections.Generic.IEnumerable)» имеет некоторые недопустимые аргументы.

Как я могу избавиться от этой ошибки?

этот код стандартный?

Благодарность


person Arian    schedule 30.04.2011    source источник


Ответы (2)


Я мог упустить момент... но:

IQueryable наследуется от IEnumerable, поэтому я думаю, что AsEnumerable() в этом коде не нужен.

Если вам действительно нужно/хотите выполнить запрос перед выполнением Select, вы можете использовать ToList() вместо AsEnumerable() - это будет понятнее

Мне также интересно, включаете ли вы using System.Linq в свой файл .cs, поскольку AsEnumerable() является методом расширения в System.Linq

person Stuart    schedule 30.04.2011
comment
AsEnumerable() — это необходимый шаг, чтобы иметь возможность выполнять запросы Linq to Objects поверх запроса Linq to Entities/SQL. - person BrokenGlass; 01.05.2011
comment
Дело не в using, в этом случае у него была бы другая ошибка. - person Snowbear; 01.05.2011
comment
Я думаю, дело в том, что Join возвращает пользовательскую проекцию, и она должна быть AsEnumerable‹TResult›(). Я должен проверить ее и написать здесь результат. - person Arian; 01.05.2011

Вы вызываете AsEnumerable<TResult2> для перечисления, которое будет иметь тип IQueryable<TResult>. Вы должны вызвать AsEnumerable<TResult> или даже можете опустить общий параметр и вызвать AsEnumerable()

Также ваш следующий выбор не будет работать по той же причине - вы предоставляете неправильные типы для дженериков.

person Snowbear    schedule 30.04.2011