您的位置:首页 > 其它

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

2012-12-11 16:09 453 查看
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();

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