2012-03-15 29 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()) 
         }; 

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