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 });
            }
    
  • 相关阅读:
    (ZOJ 3329) One Person Game (概率DP)
    python爬虫之json数据处理
    1034 Head of a Gang 图的遍历,map使用
    1030 Travel Plan Dijkstra+dfs
    vs C++ scanf 不安全
    1021. Deepest Root DFS 求最长无环路径
    1013. Battle Over Cities 用dfs计算联通分量
    无法解析的外部符号
    PAT DFS,BFS,Dijkstra 题号
    1004 Counting Leaves 对于树的存储方式的回顾
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323430.html
Copyright © 2011-2022 走看看