谓词生成器c#混淆

谓词生成器c#混淆,c#,linq,predicatebuilder,C#,Linq,Predicatebuilder,我试图理解谓词生成器,以便将其应用于我正在创建的web应用程序 基本上,我有4个通过POST请求输入的参数,“姓名”、“位置”、“年龄”、“性别”,我必须根据这些参数从数据库表中筛选出人员 问题是,每个参数都有可能是“All”(意思是,如果name='All',这意味着不按姓名筛选人员,如果location='All'不按位置筛选人员等等) 所以我想到的一种方法是将所有人都列在一个列表中,并有4个if语句: if (name != 'All') { //filter list of peopl

我试图理解谓词生成器,以便将其应用于我正在创建的web应用程序

基本上,我有4个通过POST请求输入的参数,“姓名”、“位置”、“年龄”、“性别”,我必须根据这些参数从数据库表中筛选出人员

问题是,每个参数都有可能是“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
}
但我不想这样做,我想使用谓词生成器来构建linq表达式,只获取匹配参数的人员列表,但我不明白谓词生成器在做什么


是我正在查看的网站,但它没有真正解释发生了什么,我不知道如何将其应用到我的情况中

也许我不理解这个问题,但为什么你不能这样做:

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));
    }
}
公共类示例{
私人间接回购;
//在此处传递数据库上下文摘要
公开示例(电子逆向回购){
本条:回购=回购;
}
public IEnumerable PostMethod(string name=“All”,string age=“All”,
字符串高度=“全部”,字符串重量=“全部”){
//请在此处引用您的数据库摘要
返回repos.People.Where(x=>name==“All”| | x.name==name)
其中(x=>age==“All”| | x.age.Contains(age))
.其中(x=>height==“All”| | x.height.StartsWith(height))
其中(x=>weight==“All”| | x.weight.EndsWith(weight));
}
}

这正是答案。我肯定OP不明白表达式在分配时是如何组合的。因为我是一个noob,你能详细说明一下如何进行查询并使用它吗?顺便说一下,我忘了提到我使用的是实体框架,这会改变什么吗?抱歉,我只是不太熟悉c#@AbdulAhmad的sql查询-我仍然不确定您的确切问题是什么。您是否已经准备好使用EF显示数据库中所有记录的代码?如果是这样的话,你应该把它贴出来。如果不是的话,你应该在另一个问题中问这个问题。@AbdulAhmad-编辑了我的答案。链接的网站准确地解释了这个工具是如何工作的,它有很多关于如何使用它的例子,甚至涵盖了这个确切的案例。您只需阅读自己的链接即可获得答案。@Servy我仍然需要一些澄清,否则我不会问,因此无需说明明显的问题您需要澄清什么?你刚才说,“向我解释整件事”,这正是链接正在做的。如果您对该工具的某个特定方面、用法、解释等有特定的问题,那么您需要问这个问题。你没有那么做。你生气和愤怒了吗?你愿意问一个有责任感的人吗,在完成研究后,合理确定问题的范围,并在提出问题之前尽合理努力解决问题,而不是提出问题,因为你只是懒得阅读你想要使用的工具的文档?问题是我无法检查prop=='All',因为这不会返回任何结果,没有任何属性的值为“All”。如果您是正确的,我的代码是错误的。我打字太快了。更新的答案。我明白了,那么我如何用这个访问数据库呢?会不会是数据库上下文。人。??我以前没有使用过查询,因此我不确定在获取结果object后如何访问数据库。这会导致引发异常。。不确定为什么会出现哪种类型的异常。。?