2011-09-23 4 views
2

Mon exigence est d'implémenter une méthode Generic Join qui serait IQueryable Join.LINQ Générique Join et Entity Framework

J'ai utilisé la méthode d'inscription comme indiqué ci-dessous:

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

J'ai utilisé la méthode d'inscription comme indiqué ci-dessous:

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

Mais j'obtiens l'erreur comme indiqué ci-dessous:

Aucune méthode générique 'Join' sur le type 'System.Linq.Queryable' est compatible avec les arguments de type et les arguments fournis. Aucun argument de type ne doit être fourni si la méthode est non générique.

Aidez-nous s'il vous plaît.

+0

Essayez 'IQueryable' plutôt que' Queryable' pour commencer. – Enigmativity

+0

Ça ne marche pas aussi bien. L'erreur est Aucune méthode 'Join' existe sur le type 'System.Linq.IQueryable'. – Mahadesh

+0

Vous manquez un 'using System.Linq;'? –

Répondre

0
outerSelectorLambda.Body.Type 

Cela ne devrait-il pas être Body.ReturnType?


Cette instruction de retour est trop grande. Brisez-le et regardez les types avec le débogueur.