2011-04-30 23 views
1

我写这个方法:问题与使用Lambda表达式和表达式加入符树

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' does not contain a definition for 'AsEnumerable' and the best extension method overload 'System.Linq.Enumerable.AsEnumerable(System.Collections.Generic.IEnumerable)' has some invalid arguments

我怎样才能摆脱这种错误的?

是这样的编码标准吗?

感谢

回答

0

我可能会错过了点...但是:从IEnumerable

IQueryable继承所以我认为AsEnumerable()是在此代码是不必要的。

如果你真的需要/想在做Select之前执行查询,那么你可以使用ToList()代替AsEnumerable() - 这将是更清晰

我也想知道,如果你包括你的using System.Linq。 cs文件 - 作为AsEnumerable()System.Linq中的扩展方法

+0

'AsEnumerable()'是能够在Linq to Entities/SQL查询的顶部执行Linq到Objects查询的必要步骤。 – BrokenGlass 2011-04-30 21:18:52

+0

这不是关于'using',他在这种情况下会有不同的错误。 – Snowbear 2011-04-30 21:18:57

+0

我认为重点是联合返回一个自定义投影,它必须是AsEnumerable ()。我必须测试它并在此处写入结果。 – Arian 2011-05-01 05:06:45

2

您对enumerable调用AsEnumerable<TResult2>,这将是IQueryable<TResult>类型。你应该拨打电话AsEnumerable<TResult>或者你甚至可以省略通用参数并呼叫AsEnumerable()

你的下一个选择也不会出于同样的原因 - 你提供的是泛型的错误类型。