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