Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ通用连接和实体框架_C#_Linq_Entity Framework_Generics_Join - Fatal编程技术网

C# LINQ通用连接和实体框架

C# LINQ通用连接和实体框架,c#,linq,entity-framework,generics,join,C#,Linq,Entity Framework,Generics,Join,我的要求是实现一个通用的连接方法,该方法可以实现IQueryable连接 我使用了Join方法,如下所示: public static IQueryable Join(this IQueryable outer, IEnumerable inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values) { if (inner == null)

我的要求是实现一个通用的连接方法,该方法可以实现IQueryable连接

我使用了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);
    }
       var q = Join(e1, e2, "Company_ID", "Company_ID",
        "new ( outer.Company_ID as CompanyId)"      );
但我得到的错误如下所示:

类型“System.Linq.Queryable”上的泛型方法“Join”与提供的类型参数和参数不兼容。如果方法是非泛型的,则不应提供类型参数

请帮忙

outerSelectorLambda.Body.Type
这不应该是Body.ReturnType吗

这个返回语句太大了。将其分解并使用调试器查看类型

这不应该是Body.ReturnType吗


这个返回语句太大了。将其拆分,并使用调试器查看类型。

尝试使用IQueryable而不是Queryable开始。这也不起作用。错误是类型“System.Linq.IQueryable”上不存在方法“Join”。是否缺少正在使用的System.Linq;?不确定它是否真的有用,但可以查看LinqKit@检查outerSelectorLambda和innerSelectorLambda表达式的类型,即表达式和表达式,并确保TKey的类型匹配。确保TInner和TOuter类型也与其他参数匹配。请尝试从IQueryable而不是Queryable开始。这也不起作用。错误是类型“System.Linq.IQueryable”上不存在方法“Join”。是否缺少正在使用的System.Linq;?不确定它是否真的有用,但可以查看LinqKit@检查outerSelectorLambda和innerSelectorLambda表达式的类型,即表达式和表达式,并确保TKey的类型匹配。确保TInner和TOuter类型也与其他参数匹配。