2009-08-20 64 views
6

在我之前關於使用動態構建的字符串(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)方法。哪些工作,但我有興趣找到其他解決方案。尤其適用於基準測試目的。

任何想法?

回答

2

首先 - 如果你以這種方式訪問​​的字典,那麼你不使用它作爲一本字典 - 你試過:

var qry = myDictionary.Values.AsQueryable().Where(sQuery); 

(注意,如果你正在使用object,你會可能需要一個Cast<Customer>OfType<Customer>在某處)

否則:

TIEnumerable<T>(因此也爲IQueryable<T>致電後擴展方法)爲Dictionary<TKey,TValue>KeyValuePair<TKey,TValue> - 所以你應該能夠使用Where("Value.CustomerID == 12345")或類似的東西。

+1

有趣的事情就是這個。然而var qry = myDictionary.Values.AsQueryable()。Where(sQuery); 只會搜索字典的所有對象的值,所以它仍然無法獲取存儲在Keys「CustomerID」中的實際名稱。 隨着你的第二個建議,我能得到任何與動態linq庫一起工作的最接近的東西是: 搜索字符串,如:「Keys [」CustomerID「] == 12345」,但它仍然在庫中炸得更深,因爲它們返回的memberinfo只是對KeysCollection的引用而不是具體的值。 – Jabezz 2009-08-20 09:45:53