动态生成查询表达式

痕迹g 表达式树

   public static Expression<Func<T, bool>> GenerateQueryExp<T>(T searchModel) where T : class, new()
        {
            List<MethodCallExpression> mcList = new List<MethodCallExpression>();
            List<BinaryExpression> mcList2 = new List<BinaryExpression>();
            Type type = searchModel.GetType();
            ParameterExpression parameterExpression = Expression.Parameter(type, "x");
            var pros = type.GetProperties();
            foreach (var t in pros)
            {
                var objValue = t.GetValue(searchModel, null);
                if (objValue != null && t.Name != "isid")
                {
                    Expression proerty = Expression.Property(parameterExpression, t);
                    ConstantExpression constantExpression = Expression.Constant(objValue, t.PropertyType);
                    if (t.PropertyType.Name != "Int32" && t.PropertyType.Name != "ICollection`1" && t.PropertyType.Name != "Nullable`1")
                        mcList.Add(Expression.Call(proerty, typeof(string).GetMethod("Contains"), new Expression[] { constantExpression }));
                    else if (t.PropertyType.Name == "Int32"&& !objValue.ToString().Equals("0"))
                    {                    
                        mcList.Add(Expression.Call(proerty, typeof(Int32).GetMethod("Equals", new Type[]
                         { typeof(Int32) }), new Expression[] { constantExpression }));
                    }
                    else if (t.PropertyType.Name == "Nullable`1" && !objValue.ToString().Equals("0"))
                    {
                        mcList2.Add(Expression.Equal(proerty, constantExpression));
                    }
                }
                
            }

            if (mcList.Count == 0)
            {
                if(mcList2.Count == 0)
                    return Expression.Lambda<Func<T, bool>>(Expression.Constant(true, typeof(bool)), new ParameterExpression[] { parameterExpression });
                else
                    return Expression.Lambda<Func<T, bool>>(MethodCall(mcList2), new ParameterExpression[] { parameterExpression });

            }

            else
                return Expression.Lambda<Func<T, bool>>(MethodCall(mcList), new ParameterExpression[] { parameterExpression });
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值