遵循来自http://www.albahari.com/nutshell/predicatebuilder.aspx的示例
IQueryable<Product> SearchProducts (params string[] keywords)
{
var predicate = PredicateBuilder.False<Product>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or (p => p.Description.Contains (temp));
}
return dataContext.Products.Where (predicate);
}
我有一个类似的要求,除了首先我必须进行 AND 查询,其次,与上面的示例不同,我有一堆字段名称和一个要在每个字段中搜索的值。在用户通过之前,字段名称和值都是未知的。我最终做了类似下面的代码,但显然是非常紧密耦合的。
IEnumerable<someClass> qry = context.someClass;
var pb = PredicateBuilder.True<someClass>();
foreach (customClass rule in Filters)
{
switch ( rule.field)
{
case "FirstName":
pb = pb.And(p=>p.FirstName.Contains(rule.data));
break;
case "LastName":
pb = pb.And(p=>p.LastName.Contains(rule.data));
break;
case "City":
pb = pb.And(p=>p.City.Contains(rule.data));
break;
}
qry.AsQueryable().Where(pb);
}
return qry;
从上面可以看出,Rule 类具有字段和数据属性。理想的情况是,如果我可以动态创建 predicatebuilder ,例如
filterClause = "p=>p." + rule.field + ".Contains(" + rule.data + ")";
pb = pb.And(filterClause);
qry.AsQueryable().Where(pb);
提前感谢您的任何意见