动态对象的Lambda表达式

时间:2014-12-13 08:37:20

标签: c# linq lambda

我正在尝试为在运行时创建的表构建Lambda表达式。 Expression构建正常,但是当我调用Compile()方法时,我得到了这个错误 “类型'cseval.Item'的ParameterExpression不能用于'System.Object'类型的委托参数” 这是我的功能

    public Func<dynamic, Boolean> GetWhereExp(List<WhereCondition> SearchFieldList, dynamic item)
    {

        ParameterExpression pe = Expression.Parameter(item.GetType(), "c");

        Expression combined = null;

        if (SearchFieldList != null)
        {
            foreach (WhereCondition fieldItem in SearchFieldList)
            {
                //Expression for accessing Fields name property
                Expression columnNameProperty = Expression.Property(pe, fieldItem.ColumName);


                //the name constant to match 
                Expression columnValue = Expression.Constant(fieldItem.Value);

                //the first expression: PatientantLastName = ?
                Expression e1 = Expression.Equal(columnNameProperty, columnValue);

                if (combined == null)
                {
                    combined = e;
                }
                else
                {
                    combined = Expression.And(combined, e);
                }
            }
        }
        var result = Expression.Lambda<Func<dynamic, bool>>(combined, pe);
        return result.Compile();
    }

1 个答案:

答案 0 :(得分:2)

我已将动态更改为泛型,此代码适用于我:

    public Func<T, Boolean> GetWhereExp<T>(List<WhereCondition> SearchFieldList, T item)
    {
        var pe = Expression.Parameter(item.GetType(), "c");
        Expression combined = null;
        if (SearchFieldList != null)
        {
            foreach (var fieldItem in SearchFieldList)
            {
                var columnNameProperty = Expression.Property(pe, fieldItem.ColumName);
                var columnValue = Expression.Constant(fieldItem.Value);
                var e1 = Expression.Equal(columnNameProperty, columnValue);
                combined = combined == null ? e1 : Expression.And(combined, e1);
            }
        }
        var result = Expression.Lambda<Func<T, bool>>(combined, pe);
        return result.Compile();
    }

小注释:您的方法返回函数,而不是表达式,因此名称'GetWhereExp'稍​​微不正确。如果你想返回函数,imho,最好使用反射。

UPD:我使用此代码进行测试:

            var expressions = new List<WhereCondition>
                {
                    new WhereCondition("Column1", "xxx"),
                    new WhereCondition("Column2", "yyy"),
                };

            var item = new
                {
                    Column1 = "xxx",
                    Column2 = "yyy"
                };

            var func = LinqExpr.GetWhereExp(expressions, (dynamic)item);

            Console.WriteLine(new[] {item}.Count(a => func(a)));
相关问题