zoukankan      html  css  js  c++  java
  • 巧用表达式树动态构建查询条件

    项目中有个高级查询的功能,根据不同查询条件的各种组合来查询mongo,这种情况,可使用Expression来动态拼接查询条件来简化操作

    BLL中相关代码如下

    public DataResult GetRateStaticList(object param, bool paginating = false)
            {
                object result = null;
                long count = 0;
                var dicParam = FromParam(param);
    
                ParameterExpression p_rate = Expression.Parameter(typeof(Entity.RateStaticMessage), "rate");
    
                MemberExpression m_chain = Expression.PropertyOrField(p_rate, "Chain");
                ConstantExpression c_chain = Expression.Constant(dicParam["Chain"]);
                var q_chain = Expression.Equal(m_chain, c_chain);
                if (dicParam.ContainsKey("Hotel"))
                {
                    MemberExpression m_hotel = Expression.PropertyOrField(p_rate, "Hotel");
                    ConstantExpression c_hotel = Expression.Constant(dicParam["Hotel"]);
                    var q_hotel = Expression.Equal(m_hotel, c_hotel);
                    q_chain = Expression.AndAlso(q_chain, q_hotel);
                }
                if (dicParam.ContainsKey("Channel"))
                {
                    MemberExpression m_hotel = Expression.PropertyOrField(p_rate, "Channel");
                    ConstantExpression c_hotel = Expression.Constant(dicParam["Channel"]);
                    var q_hotel = Expression.Equal(m_hotel, c_hotel);
                    q_chain = Expression.AndAlso(q_chain, q_hotel);
                }
                if (dicParam.ContainsKey("RatePlan"))
                {
                    MemberExpression m_hotel = Expression.PropertyOrField(p_rate, "RatePlan");
                    ConstantExpression c_hotel = Expression.Constant(dicParam["RatePlan"]);
                    var q_hotel = Expression.Equal(m_hotel, c_hotel);
                    q_chain = Expression.AndAlso(q_chain, q_hotel);
                }
    
                MemberExpression m_start = Expression.PropertyOrField(p_rate, "Start");
                ConstantExpression c_start = Expression.Constant(dicParam["Start"].ToString());
                var q_start = Expression.LessThanOrEqual(Expression.Call(m_start, typeof(string).GetMethod("CompareTo", new Type[] { typeof(string) }), c_start), Expression.Constant(0));
                q_chain = Expression.AndAlso(q_chain, q_start);
    
                MemberExpression m_end = Expression.PropertyOrField(p_rate, "End");
                ConstantExpression c_end = Expression.Constant(dicParam["End"].ToString());
                var q_end = Expression.GreaterThanOrEqual(Expression.Call(m_end, typeof(string).GetMethod("CompareTo", new Type[] { typeof(string) }), c_end), Expression.Constant(0));
                q_chain = Expression.AndAlso(q_chain, q_end);
    
                var exp = Expression.Lambda<Func<Entity.RateStaticMessage, Boolean>>(q_chain, p_rate);
                if (paginating)
                    result = _dal.List(exp, true, Convert.ToInt32(dicParam["Offset"]), Convert.ToInt32(dicParam["Limit"]));
                else
                    result = _dal.List(exp);
                count = _dal.Count(exp);
    
                return FromObject(result, count);
            }
    

     记录如上,以后遇到相同情况可参考。

  • 相关阅读:
    OpenGL实现通用GPU计算概述
    Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理
    OpenGL中的Shader
    Android平台Camera实时滤镜实现方法探讨(三)--通过Shader实现YUV转换RBG
    GPU:并行计算利器
    双摄像头测距的OpenCV实现
    Android Camera 通过V4L2与kernel driver的完整交互过程
    图像缩放算法
    双camera景深计算 (1)
    error: ‘shared_ptr’ in namespace ‘std’ does not name a type
  • 原文地址:https://www.cnblogs.com/seastar1989/p/6694395.html
Copyright © 2011-2022 走看看