如何在循环中构建动态AND OR linq表达式树

Fix*_*xer 11 c# linq

继我之前提出的问题之后,我现在正试图弄清楚如何为AND&OR查询构建动态表达式.

给定以下字符串数组:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"};
Run Code Online (Sandbox Code Playgroud)

我想在linq表达式中动态表达这一点 - 有点像:

var v = from p in products
        where 
        (p.Amount >= 0 && p.Amount <= 100) ||
        (p.Amount >= 101 && p.Amount <= 200) ||
        (p.Amount >= 500 && p.Amount <= 1000)
        select p;
Run Code Online (Sandbox Code Playgroud)

如何在此循环中动态构建linq表达式?

string[] ranges = new string[]{"0-100", "100-200", "500-1000"};

var query = products.AsQueryable();

foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    //Linq expression?
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*oll 19

使用谓词构建器:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"};
var predicate = PredicateBuilder.False<Product>();

foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    predicate = predicate.Or(p => p.Amount >= min && p.Amount <= max);
}
Run Code Online (Sandbox Code Playgroud)

注意我们如何从循环中的boolean状态falseor一起谓词开始.相反,你可以用的状态,开始trueand在一起的谓词.

最后,不确定查询理解语法是否可行,但您的最终查询可能如下所示:

var v = products.Where(predicate);
Run Code Online (Sandbox Code Playgroud)