2012-01-16 3 views
1

私は、特別な問題のためにlinq querysを構築する方法を探しています。どのように動的なlinqクエリを構築して一連の制約を解決するのですか?

x1> = 5、x2> = 7、Math.Sqrt(x1 + x2)のような式の集合と整数を取ることができるx1、x2、 )= 8 ....いくつかの変数を含んでいます。

私の意図は、式を考慮に入れた変数の解を得ることです。

与えたとえば、あなたがこのようなものを作成することができます

var zeroToMaxValue = Enumerable.Range(0, int.MaxValue); 
    var cp = zeroToMaxValue.AsParallel() 
     .Where(x1 => x1 >= 5) 
     .Select(x1 => new { x1 }); 
    var cp2=cp 
     .SelectMany(query => zeroToMaxValue,(query, x2) => new { query.x1, x2 }) 
     .Where(query => query.x2 >= 7 && Math.Sqrt(query.x2 + query.x1) == 8); 
    var result = cp2.First(); 
    { 
     Console.WriteLine("x1: " + result.x1 + " x2: " + result.x2); 
    } 

出力がある:×1:5×2:59

誰がなるように動的に をquerysのこの種を作成しない方法を知っていますが私はそれぞれの表現が実現する解決策を得ます。

私はすでにPredicateBuilderクラスを試して、How do you add dynamic 'where' clauses to a linq query?のように件名に関する投稿を検索しました。しかし、私が試したことは何も働かなかった。

私の主な問題の1つは、多くの変数を選択しなければならないという事実です。それぞれの変数には、それぞれ独自の数値が設定されています。これは、変数があるのと同じくらい多くのクエリを構築しなければならないということを意味しています。

私ができる最後のことは、ストリングビルダでこれらの種類のクエリを構築することですが、誰かが私を助けてより良い方法を知ってくれることを願っています。

ありがとうございました!

+0

[LINQ TO Z3 - ステロイド定理解決]を見てみましょう(http://community.bartdesmet.net/blogs/bart/archive/2009/09/27/linq-to-z3-theoremを-solving-on-steroids-part-1.aspx) – Eranga

答えて

0
var query = //..... 

foreach (var constraint in constraints) 
{ 
    query = query.Where(constraint); 
} 
+0

これは1つのクエリを構築します。私は複数の変数を持ち、各変数は数字の集合(IEnumerable zeroToMaxValueなど)で表現されているため、この1つのクエリが機能するこれらすべてのセットのクロス積を構築する必要があります。 – blacksheep

+0

私はこのようなクロスプロダクトを構築することができます: var query = from zeroToMaxValue x2 from zeroToMaxValue select new {x1、x2}; しかし、私は続ける方法を知らない。制約のタイプはまだ修正されていません。文字列に変換することもあれば、他のものに変換することもできます。私の制約は、クロス積{x1:int、x2:int}によって与えられるデータ構造に作用するものでなければなりませんか? – blacksheep

関連する問題