动态生成查询表达式

痕迹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 });
        }
posted @ 2020-07-09 16:21  OneByOneDotNet  阅读(101)  评论(1编辑  收藏  举报