2012-01-16 26 views
1

我正在尋找一種方法來構建特殊問題的linq querys。給定是一組變量,如x1,x2,x3 ....,它們可以取一個整數和一組表達式,如x1> = 5,x2> = 7,Math.Sqrt(x1 + x2 )= 8 ....包含一些變量。如何構建動態LINQ查詢以解決一組約束?

我的意圖是爲需要考慮表達式的變量獲得解決方案。

對於一個給定的例子,你可以創建這樣的事情:

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

輸出是:X1:5×2:59

有誰知道怎麼做造成這種querys動態 使我得到了滿足每個表達式的解決方案。

我已經嘗試過PredicateBuilder類並搜索了關於該主題的帖子,如How do you add dynamic 'where' clauses to a linq query?。但是我沒有嘗試過。

我的一個主要問題是,我必須選擇許多變量,每個變量都有自己的一組數字。這是否意味着,我必須建立儘可能多的查詢,因爲有變量,每個都使用前面的查詢作爲基礎,就像上面的例子一樣?

我能做的最後一件事是用stringbuilder構建這些查詢,但我希望有人能幫助我,並且知道更好的方法。

感謝您的回答!

+0

看看[LINQ到Z3 - 理論解的類固醇(http://community.bartdesmet.net/blogs/bart/archive/2009/09/27/linq-to-z3-theorem -solving-on-steroids-part-1.aspx) – Eranga 2012-01-16 12:12:07

回答

0
var query = //..... 

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

這將建立一個查詢。由於我有多個變量並且每個變量都由一組數字表示(例如,IEnumerable zeroToMaxValue),所以我必須在這個查詢一起處理的情況下構建所有這些集合的交叉積。 – blacksheep 2012-01-19 10:16:45

+0

我可以像這樣構建交叉產品(例如): var query = from x1 in zeroToMaxValue from x2 in zeroToMaxValue select new {x1,x2}; 但我不知道如何繼續。約束的類型尚未修復,我可以將其轉換爲字符串或其他(可能)。哪種類型的我的約束必須處理交叉產品{x1:int,x2:int}給出的數據結構? – blacksheep 2012-01-19 10:24:48