在我之前關於使用動態構建的字符串(where子句)和在LINQ中使用它們的問題之一中,我被引導至LINQ動態查詢圖書館Dynamic LINQ。在字典中使用LINQ動態查詢庫<string,object>和.AsQueryable()
第一個問題是它只適用於IQueryable,但是這可以通過在任何IEnumerable上使用.AsQueryable()擴展方法來克服。
我遇到的問題是,動態LINQ正在尋找一個名爲「CustomerID」的屬性(或任何傳入到動態LINQ的字符串謂詞)在我的詞典。由於Dictionary只有Keys和Values,因此顯然不起作用。
所以想到我很聰明,我創建了一個擴展: Dictionary<string, object>
,ICustomTypeDescriptor類的類。
這使我可以在類型上覆蓋GetProperties()
。這很棒。我現在可以迭代Dictionary鍵並將它們添加到返回的PropertyDescriptorCollection
。
但後來我遇到了另一個問題。在整個動態LINQ庫中,它們使用僅包含Type的「Expression實例」。但對於我的CustomTypeDescriptor
解決方案的工作,我需要一個實際的類型的實例,然後我可以申請TypeDescriptor.GetProperties(instance, false)
。
因此得到真正的問題。考慮到所有上述信息,如果數據存儲在包含鍵值對的字典中,如何將字符串格式爲「CustomerID = 1234 AND Quantity> = 10000」的自定義where子句應用於LINQ查詢。
我目前的解決方案是將數據轉換爲DataTable
並使用.Select(query)
方法。哪些工作,但我有興趣找到其他解決方案。尤其適用於基準測試目的。
任何想法?
有趣的事情就是這個。然而var qry = myDictionary.Values.AsQueryable()。Where(sQuery); 只會搜索字典的所有對象的值,所以它仍然無法獲取存儲在Keys「CustomerID」中的實際名稱。 隨着你的第二個建議,我能得到任何與動態linq庫一起工作的最接近的東西是: 搜索字符串,如:「Keys [」CustomerID「] == 12345」,但它仍然在庫中炸得更深,因爲它們返回的memberinfo只是對KeysCollection的引用而不是具體的值。 – Jabezz 2009-08-20 09:45:53