LINQ Generic Join и Entity Framework - PullRequest
       1

LINQ Generic Join и Entity Framework

2 голосов
/ 23 сентября 2011

Мое требование состоит в том, чтобы реализовать метод общего соединения, который бы использовал IQueryable Join.

Я использовал метод Join, как показано ниже:

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

Я использовал метод Join, как показано ниже:

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

Но я получаю ошибку, как показано ниже:

Нет универсального метода 'Join' для типа 'System.Linq.Queryable', совместимого с предоставленными аргументами и аргументами типа. Аргументы типа не должны предоставляться, если метод не является универсальным.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 12 января 2012
outerSelectorLambda.Body.Type

Разве это не должно быть Body.ReturnType?


Это возвращаемое утверждение слишком велико. Разбейте его и посмотрите на типы с помощью отладчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...