谓词生成器 C# 混淆
predicate builder c# confusion
我正在尝试理解 predicate builder
以便我可以将它应用到我正在创建的网络应用程序中。
基本上我有 4 个参数通过 POST 请求传入,'name'、'location'、'age'、'gender',我必须根据这些参数从数据库 table 中筛选出人员。
问题是,每个参数都有可能是 'All'(意思是,如果 name = 'All',那意味着不要按名字过滤掉人,如果 location = 'All' 不要按位置等过滤人员...)。
所以我想到的一种方法是将所有人放入一个列表中,并有 4 个 if 语句:
if (name != 'All') {
//filter list of people by name string
}
if (location != 'All') {
//filter list of people by location
}
但是我不想这样做,我想使用predicate builder来构建linq表达式并且只得到一个匹配参数的人的列表,但是我不明白predicate builder在做什么。
This 是我正在查看的网站,但它并没有真正解释发生了什么,我不知道如何将它应用到我的情况
也许我没有理解这个问题,但你为什么不能这样做:
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();
如果只有四个参数,那么我将只使用默认参数值和条件 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));
}
}
我正在尝试理解 predicate builder
以便我可以将它应用到我正在创建的网络应用程序中。
基本上我有 4 个参数通过 POST 请求传入,'name'、'location'、'age'、'gender',我必须根据这些参数从数据库 table 中筛选出人员。
问题是,每个参数都有可能是 'All'(意思是,如果 name = 'All',那意味着不要按名字过滤掉人,如果 location = 'All' 不要按位置等过滤人员...)。
所以我想到的一种方法是将所有人放入一个列表中,并有 4 个 if 语句:
if (name != 'All') {
//filter list of people by name string
}
if (location != 'All') {
//filter list of people by location
}
但是我不想这样做,我想使用predicate builder来构建linq表达式并且只得到一个匹配参数的人的列表,但是我不明白predicate builder在做什么。
This 是我正在查看的网站,但它并没有真正解释发生了什么,我不知道如何将它应用到我的情况
也许我没有理解这个问题,但你为什么不能这样做:
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();
如果只有四个参数,那么我将只使用默认参数值和条件 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));
}
}