2010-04-01 17 views
0

我有一個基於LINQ to SQL數據提供者的WCF數據服務。根據請求擴展WCF數據服務以合成缺失數據

我正在查詢「讓我把兩個日期之間的所有記錄」。

問題是我想綜合兩個額外的記錄,這樣我總是得到落在開始日期和結束日期的記錄,加上來自數據庫的所有記錄。

有沒有辦法「攔截」請求,以便我可以綜合這些記錄並將它們返回給客戶端?

謝謝

回答

0

我越覺得這個更多的,我會說「請不要這樣做」。問題在於,在WCF數據服務(或OData)中,您返回的每個實體(實體==記錄)都需要具有其唯一的URI。客戶端還假定如果實體從服務器返回(除非它被刪除),則可以再次訪問該實體。 就你而言,邊界實體是由查詢定義的,它們實際上只存在於查詢的上下文中。鑑於不同的查詢,他們是不同的。總而言之,它們不像實體一樣行爲,它們更像是某種查詢元數據。

無論如何,如果你真的認爲這是正確的做法......這是很難做到這一點。我能想到的唯一方法就是掛鉤從實體集返回的IQueryable(將自己的IQueryable層疊到LINQ to SQL之上)。然後,當查詢得到執行時,您解析表達式樹並找到定義範圍的條件,然後返回IEnumerable的一個自定義實現,它將在開始和結束時「合成」兩個特殊實體,它將返回取決於底層的LINQ to SQL結果。所有這些都是很多代碼,這絕對不容易。

第二種可能的方式是將其作爲服務操作來實現(要求客戶端知道服務器上有特殊的操作來執行此操作)。它也會更有意義,因爲服務操作會將範圍作爲參數而不是過濾器,因此您可以更輕鬆地找出範圍(無表達式樹解析)。

+0

我認爲這個問題發生的全部原因是因爲我懷疑MS是不好的做法...提供了使用DataService <>類通過OData公開數據庫的簡單方法。然後每個人都這樣做,因爲它很容易,但是從什麼時候開始將實現細節(db schema)暴露給外部世界是一個好主意? – Schneider 2010-06-16 02:05:27

+0

其實我們建議您在數據庫和DataService之間使用EF。這樣你就不會公開實現細節。相反,您可以通過使用正確的EF模型來選擇哪些部分以及如何公開。 使用LINQ to SQL,您仍然有隱藏數據庫模式的可能性,但並不是那麼豐富。 – 2010-06-16 14:29:10