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 });
            }
    
  • 相关阅读:
    2016中国大学生程序设计竞赛
    POJ 2239 化二分图右集合二维为一位的最大匹配
    POJ 1274 二分图最大匹配简单单向
    二分图最大匹配模板
    找割点和割边
    HDU 4432 求因子+进制转换
    HDU 4438 概率 多个情况下的数学期望
    HDU 4424 并查集+贪心思想
    POJ 1611 记录节点数的并查集
    HDU 4430 二分查找
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323430.html
Copyright © 2011-2022 走看看