Следуя этому примеру из 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);
Заранее спасибо за любые материалы
from x in xs where x.ok? x.a : x.snd? x.b : x.c select ...
или использоватьlet tmp = x?a:b select tmp...
, и EF это поймет. - person Tuomas Hietanen   schedule 01.09.2016