![](/img/trans.png)
[英]Get ALL or SPECIFIC data from the DB using multiple query parameters (ASP.NET Core Web Api)
[英]Querying EF DB using multiple input parameters from Web API
我有一個帶有多個輸入參數的簡單 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);
這是我被困住的地方。 如何將所有謂詞組合在一起:謂詞1、2、3、4?
我用谷歌搜索,發現有 Expression.OrElse 但不確定如何正確使用它,它只接受 2 個謂詞。 我以為我可以這樣使用它:
var total = Expression.OrElse(predicate1, predicate2);
total = Expression.OrElse(total, predicate3);
total = Expression.OrElse(total, predicate4);
但它不起作用。
你可以這樣做:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.