码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-01 22:37:03      阅读:430      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   div   代码   log   

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条件

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

标签:style   blog   color   io   使用   ar   div   代码   log   

原文地址:http://www.cnblogs.com/tianguook/p/3950059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!