2011-09-23 118 views
2

我的要求是實現一個通用連接方法,它將IQueryable加入。LINQ通用連接和實體框架

我已經使用了加入方法如下所示:

public static IQueryable Join(this IQueryable outer, IEnumerable inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values) 
    { 
     if (inner == null) throw new ArgumentNullException("inner"); 
     if (outerSelector == null) throw new ArgumentNullException("outerSelector"); 
     if (innerSelector == null) throw new ArgumentNullException("innerSelector"); 
     if (resultsSelector == null) throw new ArgumentNullException("resultsSelctor"); 

     System.Linq.Expressions.LambdaExpression outerSelectorLambda = DynamicExpression.ParseLambda(outer.ElementType, null, outerSelector, values); 
     System.Linq.Expressions.LambdaExpression innerSelectorLambda = DynamicExpression.ParseLambda(inner.AsQueryable().ElementType, null, innerSelector, values); 

     System.Linq.Expressions.ParameterExpression[] parameters = new System.Linq.Expressions.ParameterExpression[] { 
     System.Linq.Expressions.Expression.Parameter(outer.ElementType, "outer"), System.Linq.Expressions.Expression.Parameter(inner.AsQueryable().ElementType, "inner") }; 
     System.Linq.Expressions.LambdaExpression resultsSelectorLambda = DynamicExpression.ParseLambda(parameters, null, resultsSelector, values); 

     return outer.Provider.CreateQuery(
      System.Linq.Expressions.Expression.Call(
       typeof(Queryable), "Join", 
       new Type[] 
       { 
        outer.ElementType, 
        inner.AsQueryable().ElementType, 
        outerSelectorLambda.Body.Type, 

        resultsSelectorLambda.Body.Type 
       }, 
       outer.Expression, 
       inner.AsQueryable().Expression, 
       System.Linq.Expressions.Expression.Quote(outerSelectorLambda), 
       System.Linq.Expressions.Expression.Quote(innerSelectorLambda), 
       System.Linq.Expressions.Expression.Quote(resultsSelectorLambda))); 
    } 


    //The generic overload. 
    public static IQueryable<T> Join<T>(this IQueryable<T> outer, IEnumerable<T> inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values) 
    { 
     return (IQueryable<T>)Join((IQueryable)outer, (IEnumerable)inner, outerSelector, innerSelector, resultsSelector, values); 
    } 

我已經使用了加入方法如下所示:

 var q = Join(e1, e2, "Company_ID", "Company_ID", 
     "new (outer.Company_ID as CompanyId)"  ); 

,但我得到的錯誤,如下圖所示:

類型'System.Linq.Queryable'上沒有泛型方法'Join'與提供的類型參數和參數兼容。如果方法是非泛型的,則不應提供類型參數。

請幫忙。

+0

嘗試'IQueryable'而不是'Queryable'來開始。 – Enigmativity

+0

這不起作用。錯誤是No方法'Join'存在於'System.Linq.IQueryable'類型上。 – Mahadesh

+0

你是否錯過了'使用System.Linq;'? –

回答

0
outerSelectorLambda.Body.Type 

不應該是Body.ReturnType


這個return語句太大了。分解它並使用調試器查看類型。