在Lambda表达式和表达式树中使用Join运算符的问题

时间:2011-04-30 20:19:56

标签: linq c#-4.0 lambda c#-3.0 expression-trees

我写这个方法:

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.Enumerable.AsEnumerable(System.Collections.Generic.IEnumerable)'有一些无效的参数

我如何摆脱这个错误?

是这个代码标准吗?

感谢

2 个答案:

答案 0 :(得分:2)

您在枚举上调用AsEnumerable<TResult2>,其类型为IQueryable<TResult>。您应该致电AsEnumerable<TResult>,或者您甚至可以省略通用参数并致电AsEnumerable()

此外,您的下一个选择也不会出于同样的原因 - 您为泛型提供了错误的类型。

答案 1 :(得分:0)

我可能会忽略这一点......但是:

IQueryable继承自IEnumerable,因此我认为此代码中不需要AsEnumerable()

如果您确实需要/想要在执行Select之前执行查询,那么您可以使用ToList()代替AsEnumerable() - 这会更清楚

我也想知道您是否在{。1}}中添加了using System.Linq - 因为AsEnumerable()System.Linq

中的扩展方法