C# Expression表达式树的And、Or逻辑运算(可用于Lambda表达式之前先动态拼接查询条件)

PredicateBuilder类(linq多条件组合查询)

PredicateBuilder类如下:

复制代码

 public static class PredicateBuilder
    {

        /// <summary>
        /// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效  
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        /// <summary>
        /// 机关函数应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混应时写在OR后面的AND有效  
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
        } 
    }

复制代码

  多条件查询的代码:

复制代码

/// <summary>
    /// 多条件查询
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnSearch_Click(object sender, EventArgs e)
    {
        using(LinqDBDataContext db = new LinqDBDataContext())
        {
            var list = db.StuInfo;
            var where = PredicateBuilder.True<StuInfo>();
            if(this.txtName.Text.Trim().Length!=0)
            {
                where = where.And(p => p.StuName.Contains(this.txtName.Text.Trim()));
            }
            if(this.txtAge.Text.Trim().Length!=0)
            {
                where = where.And(p => p.StuAge == Convert.ToInt32(this.txtAge.Text.Trim()));
            }
            var result = list.Where(where).ToList();
            this.repStuInfo.DataSource = result;
            this.repStuInfo.DataBind();
        }
    }

复制代码

  上面代码中,txtName是姓名文本框,txtAge是年龄文本框,因为要进行and条件查询所以一开始使用PredicateBuilder.True<StuInfo>()来创建初始为true的where条件,

如果进行or多条件查询,就应该使用PredicateBuilder.False<StuInfo>()来创建初始为false的where条件

 

______________________________________

以下例子是参考以上的实现先构建条件再加入Lambda表达式的代码:

public ListDHCP_NonJxxxxDevice GetNotJxxxxHistory(string site, DateTime? start, DateTime? end, string keyWord, bool newload = false)

{

    var list = new ListDHCP_NonJxxxxDevice();

    try

    {

        ExpressionFuncDHCP_NonJxxxxDevicebool>> filterExp=null;

        if (!string.IsNullOrWhiteSpace(site))

        {

            filterExp = row = row.SiteName == site;

        }

        if (newload)    //打开页面时初次加载

        {                    

            ExpressionFuncDHCP_NonJxxxxDevicebool>> sec = p = p.Action == null;

            filterExp =

                Expression.LambdaFuncDHCP_NonJxxxxDevicebool>>(

                    ParameterExpression.AndAlso(

                        filterExp.Body, Expression.Invoke(sec, filterExp.Parameters.CastExpression())

                        )

                    , filterExp.Parameters

                );

        }

        else

        {

            if (start != null && end != null)

            {

                ExpressionFuncDHCP_NonJxxxxDevicebool>> sec = p = p.InsertTime = start && p.InsertTime = end;

                filterExp =

                    Expression.LambdaFuncDHCP_NonJxxxxDevicebool>>(

                    ParameterExpression.AndAlso(

                        filterExp.Body, Expression.Invoke(sec, filterExp.Parameters.CastExpression())

                        )

                    , filterExp.Parameters

                );

            }

            if (!string.IsNullOrEmpty(keyWord))

            {

                ExpressionFuncDHCP_NonJxxxxDevicebool>> sec =

                                 p = p.PcName.Contains(keyWord)

                                     || p.IPAddress.Contains(keyWord)

                                     || p.MacAddress.Contains(keyWord)

                                     || p.Building.Contains(keyWord)

                                     || p.Floor.Contains(keyWord);

                filterExp = Expression.LambdaFuncDHCP_NonJxxxxDevicebool>>(

                                ParameterExpression.AndAlso(filterExp.Body,Expression.Invoke(sec,filterExp.Parameters.CastExpression()))

                                , filterExp.Parameters);

 

            }

        }

        var data = filterExp != null

            ? pcContext.DHCP_NonJxxxxDevices.Where(filterExp)

            : pcContext.DHCP_NonJxxxxDevices;

 

        list = data.ToList();

    }

    catch (Exception ex)

    {

        LogHelper.RecordLogToDb(0, "AMS.BIZ.Monitor""Class:MonitorHelper   Function:GetNotJxxxxHistory    Error:" + ex.Message, "admin");

    }

    return list;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值