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

本文关键字:动态 linq 表达式 构建 循环 | 更新日期: 2023-09-27 18:27:57

给定以下字符串arrray:

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

我想用linq表达式动态地表达这一点——大致如下:

var query = from p in Db.Products()
            where p.Amount() >= 0
            where p.Amount() <= 100
            where p.Amount() >= 101
            where p.Amount() <= 200
            where p.Amount() >= 500
            where p.Amount() <= 1000
            select p;

我知道如何从数组中提取值,所以这不是问题所在,但更重要的是,我如何在for循环中动态构建linq表达式:

string[] ranges = new string[]{"0-100", "100-200", "500-1000"};
foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    //Linq expression?
}

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

像这样:

IQueryable<Product> query = DB.Products();
foreach (var item in ranges)
{
    int min = int.Parse(item.Split('-').First());
    int max = int.Parse(item.Split('-').Last());                
    query = query.Where(p => p.Amount() >= min && p.Amount() <= max);
}

(我只有你的where子句的一半,但它是等效的。如果你真的想,你可以把它分解。)

注意返回到query的赋值-像Where这样的方法返回一个查询,这是将操作应用于现有的结果;它们不会更改现有查询中的任何内容。

试用以下代码:

           var result= from range in ranges
                       select new 
                       {
                           min = int.Parse(range.Split('-').First()),
                           max = int.Parse(range.Split('-').Last()) 
                       };

结果包含所有最小值和最大值…