【问题标题】:Querying EF DB using multiple input parameters from Web API使用来自 Web API 的多个输入参数查询 EF DB
【发布时间】:2022-01-23 02:06:33
【问题描述】:

我有一个带有多个输入参数的简单 Web API 操作:

MethorA(string val1, string val2, int val3, int val4){}

多个参数可以是可选的:

MethorA(string val1, string val2 = null, int val3 = null, int val4 = null){}

我使用这些参数作为一个复杂的表达式来使用 EF 查询数据库。

所以我构建了几个子表达式,如下所示:

Expression<Func<A, bool>> predicate1 = x=> x.f1 ==val1;
Expression<Func<A, bool>> predicate2 = x=> x.f2 ==val2;
Expression<Func<A, bool>> predicate3 = x=> x.f3 ==val3;
Expression<Func<A, bool>> predicate4 = x=> x.f4 ==val4;

现在我需要构建一个谓词,我可以将它传递给我的数据访问层,它接受如下内容:

context.Entity.FilterBy(Expression<Func, bool> predicate);

这是我被困住的地方。如何将所有谓词组合在一起:predicate1,2,3,4?

我用谷歌搜索,发现有 Expression.OrElse 但不确定如何正确使用它,它只接受 2 个谓词。我以为我可以这样使用它:

var total = Expression.OrElse(predicate1, predicate2);
total = Expression.OrElse(total, predicate3);
total = Expression.OrElse(total, predicate4);

但它不起作用。

【问题讨论】:

  • 我正在链接另一个答案而不是标记为重复,因为我不知道这是否真的解决了问题,但是您是否考虑过谓词生成器? stackoverflow.com/questions/51720429/…
  • 你希望它们是 And 还是 Or?

标签: c# asp.net-core .net-core


【解决方案1】:

你可以这样做:

Expression<Func<A, bool>> predicate1 = x=> x.f1 == val1;
Expression<Func<A, bool>> predicate2 = x=> x.f2 == val2;
Expression<Func<A, bool>> predicate3 = x=> x.f3 == val3;
Expression<Func<A, bool>> predicate4 = x=> x.f4 == val4;

var body = Expression.Or(predicate1.Body, predicate2.Body);
var lambda = Expression.Lambda<Func<A, bool>>(body, predicate2.Parameters[0]);

body = Expression.Or(lambda.Body, predicate3.Body);
lambda = Expression.Lambda<Func<A, bool>>(body, predicate3.Parameters[0]);

body = Expression.Or(lambda.Body, predicate4.Body);
var finalExpression = Expression.Lambda<Func<A, bool>>(body, predicate4.Parameters[0]);

您可以将finalExpression 传递给过滤器。

如果你想使用And而不是Or,只需将Or方法替换为And

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多