linq - 如何创建动态LINQ join扩展方法

标签 linq linq-to-sql c#-3.0 linq-to-entities linq-to-objects

有一个动态库LINQ扩展方法作为样本发布,带有 Visual Studio 2008 .我想用 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");

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

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

    return outer.Provider.CreateQuery(
        Expression.Call(
            typeof(Queryable), "Join", new Type[] {
                outer.ElementType,
                inner.AsQueryable().ElementType,
                outerSelectorLambda.Body.Type,
                innerSelectorLambda.Body.Type,
                resultsSelectorLambda.Body.Type
            },
            outer.Expression, inner.AsQueryable().Expression,
            Expression.Quote(outerSelectorLambda),
            Expression.Quote(innerSelectorLambda),
            Expression.Quote(resultsSelectorLambda))
        );
}

最佳答案

我现在自己修好了。这是一个向 CreateQuery(... ) 调用传递太多参数的小学生错误。将以下代码粘贴到 DynamicQueryable 类中的 Dynamic.cs 文件中,以获取动态 Join 扩展方法。您可以在 http://code.msdn.microsoft.com/csharpsamples 上找到 DynamicQuery 示例项目的源代码。 .
享受。

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

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

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

        return outer.Provider.CreateQuery(
            Expression.Call(
                typeof(Queryable), "Join",
                new Type[] {outer.ElementType, inner.AsQueryable().ElementType, outerSelectorLambda.Body.Type, resultsSelectorLambda.Body.Type  },
                outer.Expression, inner.AsQueryable().Expression, Expression.Quote(outerSelectorLambda), Expression.Quote(innerSelectorLambda), 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);
    }

关于linq - 如何创建动态LINQ join扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389094/

相关文章:

C# - 如何在其末尾剪切字符串以适合 div?

c# - 相同的变量名称 - 2 个不同的类 - 如何将值从一个复制到另一个 - 反射 - C#

.net - C# WinForms,删除未使用的控件

c# - 我可以使用 linq 的复数化术语的方法吗?

c# - 使用 LINQ 从 DataTable 获取不同的项目

c# - 插入语句/存储过程死锁

c# - Linq-To-SQL GroupBy : How to calculate percentage column

c# - 按年分组帖子,然后按月分组

c# - 从 linq 查询中选择一个新类型

linq-to-sql - LINQ To SQL - 获取匹配 where 子句的最新记录