您的位置:首页 > 其它

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

2016-05-10 17:13 441 查看
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();

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: