2010-03-22 72 views
2

我正在使用通用的OData提供程序來對付我們在此處定製的數據提供程序。這是完全動態的,因爲我查詢它知道的表的數據提供者。基於OData示例代碼,我有一個基本的存儲結構。針對動態對象運行現有的LINQ查詢(DataTable like)

我的問題是:OData支持查詢並期望我提交一個IQueryable實現。在lowe rside上,我沒有任何查詢支持。不是一個笑話 - 提供程序返回表並且不支持WHERE子句。表現並不是問題 - 表格很小。可以在OData提供程序中對它們進行排序。

我的主要問題是這樣的。

  • 我提交一條SQL語句來獲取表的數據。其結果是某種ADO.NET數據讀取器在這裏。
  • 我需要爲這些數據公開一個IQueryable實現,以便稍後進行過濾。

任何ide ahow最好的接觸呢?僅限.NET 3.5(計劃一段時間沒有4.0)。我正在認真考慮爲每個表創建動態的DTO類(發送字節碼),所以我可以使用標準的LINQ。現在,我爲每個條目使用一個字典(不是太高效),但是我沒有看到根據它們進行過濾/排序的真正方法。

+0

如果您沒有對象(或結構體)來詢問謂詞,您希望如何使用過濾。 據我所見你需要提供IQuerable的實現。以便將表達式轉換爲過濾結果集的代表。 – luckyluke 2010-03-22 09:14:30

+0

從技術上講,我完全沒問題,暫時不運行任何過濾並忽略它;)有許多基本上用於填充下拉列表的表格 - 以及一些在邏輯中進行過濾的「存儲過程」無論如何。 – TomTom 2010-03-22 09:36:47

回答

0

Pablo Castro是OData背後的主要聲音之一,他表示在沒有查詢能力的情況下提供OData服務在他們的意圖內是完全一致的。見this博客文章。

這是我真的希望他們在OData響應中實現「搜索」鏈接的原因之一,以便客戶端應用程序可以確定查詢功能是否可用。就像OpenSearch一樣。

<Link rel="search" type="application/ODataQuery+xml" href="QueryMetadata.xml"/> 

這樣,客戶端可以很容易地發現搜索是否實現。

1

如果您可以在OData提供程序中執行查詢,您可以簡單地將數據加載到T的List(T是實體的類型),然後簡單地返回list.AsQueryable()。這將返回一個LINQ to Objects查詢,它提供了對所有查詢選項的全面支持,並且基於內存中的存儲(列表)。 請注意,爲了使其正常工作,您的IDataServiceQueryProvider.IsNullPropagationRequired必須返回true(因爲LINQ to Objects需要通過查詢正確傳播空值)。 另外,如果您將CanReflectOnInstanceProperty設置爲false,則需要執行一些查詢重寫。如果是這種情況,請查看這篇文章here以獲取有關如何訪問屬性的說明。