Построитель предикатов C# путаница
Я пытаюсь понять predicate builder
так что я могу применить его к веб-приложению, которое я создаю.
В основном у меня есть 4 параметра, которые приходят через запрос POST: "имя", "местоположение", "возраст", "пол", и мне нужно отфильтровать людей из таблицы базы данных на основе этих параметров.
проблема в том, что каждый параметр может быть "Все" (то есть, если name = "Все", это означает, что не отфильтровывать людей по имени, если location = "All", не фильтровать людей по местоположению и т. д.)..).
Итак, один из способов сделать это - собрать всех людей в список и получить 4 оператора if:
if (name != 'All') {
//filter list of people by name string
}
if (location != 'All') {
//filter list of people by location
}
но я не хочу этого делать, я хочу использовать построитель предикатов для построения выражения linq и получать только список людей, которые соответствуют параметрам, но я не понимаю, что делает построитель предикатов.
Это сайт, на который я смотрю, но на самом деле он не объясняет, что происходит, и я не знаю, как применить его к моей ситуации.
2 ответа
Если есть только четыре параметра, то я бы просто использовал значения параметров по умолчанию и условный Linq Where
пункт. Я включил StartsWith()
, EndsWith()
, а также Contains()
показать другие возможности.
Обновлен, чтобы уточнить, где происходит взаимодействие с базой данных.
public class Example {
private IRepository repos;
//pass in your database context abstract here
public Example(IRepository repos){
this.repos = repos;
}
public IEnumerable<Person> PostMethod(string name = "All", string age = "All",
string height = "All", string weight = "All") {
//reference your database abstract here
return repos.People.Where(x => name == "All" || x.Name == name)
.Where(x => age == "All" || x.Age.Contains(age))
.Where(x => height == "All" || x.Height.StartsWith(height))
.Where(x => weight == "All" || x.Weight.EndsWith(weight));
}
}
Возможно, я не понимаю проблему, но почему вы не можете просто сделать:
query = name == "All" ? query : query.Where(x => x.Name == name);
query = location == "All" ? query : query.Where(x => x.Location == location);
Для вашей конкретной ситуации я думаю, что вам нужно сделать следующее:
var query = db.People;
query = name == "All" ? query : query.Where(x => x.Name == name);
query = location == "All" ? query : query.Where(x => x.Location == location);
query = age == "All" ? query : query.Where(x => x.Age == age);
query = weight == "All" ? query : query.Where(x => x.Weight == weight);
var results = query.ToList();