2012-07-06 53 views
3
的序列

我掙扎動態地創建這樣一個查詢:LINQ:構建動態的過濾器與運算

Dictionary<string, Guid> parms = new Dictionary<string, Guid>(); 

foreach (var kvp in parms) 
{ 
    var exp = ReportDefinitions.Where(x=> 
     x.Discriminants.Any(y=> y.Key == kvp.Key && y.Value == kvp.Value) 
// && more conditions to add here at each cycle 
     ); 
} 

凡ReportDefinitions.Discriminants是IDictionary<string, Guid>; 我知道如何構建簡單的表達式,但我無法弄清楚如何構建這個「任何」似乎真的很複雜。 任何調用它很難undedow

任何人都知道如何處理這個?

回答

2
var query = parms.Aggregate(ReportDefinitions.AsQueryable(), 
    (a, kvp) => a.Where(x => x.Discriminants.Any(
    y => y.Key == kvp.Key && y.Value == kvp.Value))); 

我們從ReportDefinitions的未過濾查詢開始,並摺疊所有查詢參數。最終的結果是一系列嵌套的過濾器,相當於一系列的AND。

關鍵的見解是,這個過程很好地映射到從功能語言已知的減少。 LINQ to objects支持它通過Aggregate

+1

我想立即感謝您,似乎是一個簡單的解決方案。我實際上來自移動設備,我會盡快嘗試解決方案。 – mCasamento 2012-07-06 17:17:15

+1

出色地工作,底層Expression與我試圖用大量表達式構建的Expression幾乎相同。再次感謝,我剛剛學到了一些新東西 – mCasamento 2012-07-07 10:45:11