Построитель предикатов 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();
Другие вопросы по тегам