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

#linq #c#-4.0 #lambda #c#-3.0 #expression-trees

#linq #c #-4.0 #лямбда #c #-3.0 #деревья выражений

Вопрос:

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

 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>();

        }
    }
  

но выражение follow return содержит эту ошибку:

‘System.Linq.IQueryable’ не содержит определения для ‘AsEnumerable’ и перегрузки наилучшего метода расширения ‘System.Linq.Перечисляемый.AsEnumerable (Система.Коллекции.Общий.IEnumerable)’ имеет некоторые недопустимые аргументы

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

является ли этот код стандартным?

Спасибо

Ответ №1:

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

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

Ответ №2:

Возможно, я упускаю суть … но:

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

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

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

Комментарии:

1. AsEnumerable() это необходимый шаг, позволяющий выполнять запросы Linq to Objects поверх запроса Linq to Entities / SQL

2. Речь не о using , в этом случае у него была бы другая ошибка.

3. Я думаю, дело в том, что Join возвращает пользовательскую проекцию, и она должна быть AsEnumerable<TResult>(). Я должен протестировать это и записать здесь результат.