linq 动态拼接查询条件 扩展方法

时间:2022-07-26 02:58:39

public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    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);
    }

}

调用例子

protected void btnQuery_Click(object sender, EventArgs e)
    {
        var predicate = PredicateBuilder.True<Products>();
        string sProductName = txtProductName.Text;
        if (sProductName != "")
        {
            predicate = predicate.And(p=>p.ProductName.Contains(sProductName));
        }

        if (ddlCategory.SelectedIndex != 0)
        {
            predicate = predicate.And(p => p.CategoryID == Convert.ToInt32(ddlCategory.SelectedValue));
        }

        gvDemo.DataSource = dc.Products.Where(predicate).Select(p => new { p.ProductName,p.Categories.CategoryName,p.UnitPrice});
        gvDemo.DataBind();
    }