2012-03-15 25 views
8

previous質問から私は今質問しました。そしてAND & ORクエリの動的式を構築する方法を今考えています。次の文字列の配列を指定してループ内で動的AND OR式ツリーを構築する方法

string[] ranges = new string[]{"0-100", "100-200", "500-1000"}; 
私は動的LINQの式でこれを表現したいと思います

- の線に沿って何か:私は動的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; 

このループで?

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

答えて

16

使用predicate builder:我々はfalseのブール状態で始める方法

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

お知らせ、およびループで一緒にor述語。逆に、状態はtrueとなり、述語はandで始まります。

最後に、これは、クエリの理解の構文を持つことは可能ですが、あなたの究極のクエリは、次にように見えることができるかどうかわからない:これは右のトラックに私を導いた

var v = products.Where(predicate); 
+0

感謝。私は、述語ビルダーとそれ以上を含むnugetパッケージLINQKitのインストールを終了しました。これは、EFオブジェクトで作業している場合に便利です。 – Fixer

関連する問題