【问题标题】:How to build a dynamic AND OR linq expression tree in a loop如何在循环中构建动态 AND OR linq 表达式树
【发布时间】:2012-03-15 23:02:47
【问题描述】:

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

给定以下字符串数组:

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

我想在 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;

如何在这个循环中动态构建 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?
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    使用predicate builder:

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

    注意我们如何从 false 的布尔状态开始,or 在循环中一起使用谓词。相反,您可以从trueand 的状态开始,并将谓词放在一起。

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

    var v = products.Where(predicate);
    

    【讨论】:

    • 感谢这让我走上了正确的道路。我最终安装了包含谓词构建器等的 nuget 包 LINQKit。如果您正在使用 EF 对象,这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多