2012-03-15 77 views
0

考虑以下字符串arrray:如何在一个循环中建立一个动态的LINQ表达式树

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; 

我知道如何从数组中提取的值,所以这不是问题,但越是这样我如何动态地构建LINQ表达式的for循环:

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? 
} 
+1

注意;要非常小心,不要直接在任何表达式树中使用'item'本身**;它将捕获**变量**,而不是任何给定迭代的值。目前的方法获得'min'和'max'等,并在查询中使用**这些**是好的。 – 2012-03-15 11:42:37

回答

4

像这样:

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回报查询它是应用操作的现有查询的结果。它们不会更改现有查询中的任何内容。

+0

可以IEnumerable 用于IQueryable ? – Fixer 2012-03-15 11:49:01

+0

@Fixer:这取决于你想要执行查询的位置。鉴于名称,我认为这是一个LINQ to SQL查询或类似的东西。如果它是LINQ到对象 - 或者如果你想*过滤在本地完成 - 那么是的,你绝对可以使用IEnumerable '。 – 2012-03-15 11:55:27

1

试试用下面的代码:

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

结果包含了所有的最小值和最大值....