【问题标题】:predicate builder c# confusion谓词生成器 c# 混淆
【发布时间】:2015-01-15 23:30:01
【问题描述】:

我正在尝试理解 predicate builder,以便将其应用到我正在创建的网络应用程序中。

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

问题是,每个参数都有可能是 'All'(意思是,如果 name = 'All',这意味着不要按名称过滤人,如果 location = 'All' 不要按位置过滤人ETC...)。

所以我想到的一种方法是让所有人进入一个列表,并有 4 个 if 语句:

if (name != 'All') {
 //filter list of people by name string
}
if (location != 'All') {
 //filter list of people by location
}

但我不想这样做,我想使用谓词构建器来构建 linq 表达式并且只获取与参数匹配的人员列表,但我不明白谓词构建器在做什么。

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

【问题讨论】:

  • 链接网站确切地解释了该工具的工作原理,其中充满了如何使用它的示例,甚至涵盖了这个确切的案例。您只需要阅读自己的链接即可获得答案,然后再阅读一些。
  • @Servy 我还是需要澄清一下,否则我不会问,所以不需要说明显而易见的
  • 您需要澄清什么?您刚刚说,“向我解释整个事情”,这正是该链接已经在做的事情。如果您对工具的某个特定方面、它的用法、解释等有具体问题,那么您需要询问。你没有那样做。
  • 你的怒火结束了吗?
  • 您是否愿意在完成研究后提出一个可回答的、范围合理的问题,并在提出问题之前做出合理的努力来尝试解决它,而不是问一个问题,因为您只是懒得去问阅读您要使用的工具的文档?

标签: c# linq predicatebuilder


【解决方案1】:

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

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();

【讨论】:

  • 这正是答案。我确定 OP 不明白表达式在您分配时组合在一起。
  • 因为我是菜鸟,能否详细说明如何进行查询和使用?
  • 对了,我忘了说我正在使用实体框架,这有什么改变吗?抱歉,我只是不太熟悉从 c# 进行 sql 查询
  • @AbdulAhmad - 我仍然不确定您的确切问题是什么。您是否已经准备好使用 EF 显示数据库中所有记录的代码?如果是这样,您应该发布。如果不是,那您应该在另一个问题中询问。
  • @AbdulAhmad - 编辑了我的答案。
【解决方案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));
    }
}

【讨论】:

  • 问题是我无法检查 prop == 'All' 因为这不会返回任何结果,没有属性值为 'All'
  • 你是对的,我的代码是错误的。我打字太快了。更新了答案。
  • 我明白了,那我怎么用这个访问数据库呢?会是databaseContext.People.??我以前没有使用过查询,所以我不确定在获得结果对象后如何访问数据库
  • 这导致抛出异常.. 不知道为什么
  • 什么类型的异常..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多