#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 / SQL2. Речь не о
using
, в этом случае у него была бы другая ошибка.3. Я думаю, дело в том, что Join возвращает пользовательскую проекцию, и она должна быть AsEnumerable<TResult>(). Я должен протестировать это и записать здесь результат.