zoukankan      html  css  js  c++  java
  • 动态生成查询表达式

    痕迹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 });
            }
    
  • 相关阅读:
    Linux的内存分页管理
    python3将汉字转换为大写拼音首字母
    linux下安装微信小程序开发工具
    有效使用Django的QuerySets
    VsCode快捷键
    js 里面的键盘事件对应的键码
    ubuntu下wps的安装
    mac 安装 python mysqlclient 遇到的问题及解决方法
    微服务初步理解
    有return的情况下try catch finally的执行顺序(最有说服力的总结)
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323430.html
Copyright © 2011-2022 走看看