2012-07-17 89 views
0

我有一個WCF服務操作,我希望它返回一個對象圖而不是簡單的對象列表。有一些神奇的LinQ能做到這一點嗎?WCF服務操作返回對象圖

感謝

多一點的可能需要的信息:

我有幾個實體:

StockableItem
+編號
+代碼

股票
+標識
+位置
+數量

StockableItem-> Stock是1 .. *的關係。

,我這個LINQ失敗:

從SI在svc.StockableItems.Include( 「股票」)
在si.Id svc.Stock加入s等於s.Id
其中s。位置== 1 選擇si

和幾個變化。

我希望服務操作就能返回是這樣的:

StockableItem - ID = 213,代碼= XXX
StockableItem - ID = 214,代碼= XXX2
        +庫存 - ID = 214,位置= 1,數量= 3
StockableItem - ID = 215,代碼= XXX3
StockableItem - ID = 216,代碼= XXX4
        +庫存 - ID = 216,位置= 1,數量= 6

即要返回所有StockableItems以及給定位置的庫存條目。它非常簡單,只是一個左外連接:

SELECT * FROM StockableItems SI
LEFT OUTER JOIN股票S於si.Id = s.Id和s.Location = @location

而是變成了一個對象圖。

回答

1

這不是完全清楚;聽起來像你理想中想要一個OData解決方案。您不能從通過OData查詢調用的WCF數據服務服務操作中返回對象圖。你可以得到一個平坦的對象列表,但需要使用$ expand來獲取對象圖。在你的情況下,$ expand不起作用,它將返回所有stockItems通過過濾器的所有庫存實例。

我認爲最好的方法是在你的數據庫創建一個視圖(我假設你有位置的表?)

SELECT  si.Id, Locations.Location 
    FROM   StockableItem AS si 
    CROSS JOIN Locations 

在你的實體模型,添加這種觀點作爲一個實體(稱爲XXX說),並在它和你的StockableItem和股票實體之間設置導航屬性。

現在你可以運行的OData查詢,如

.../XXX?$expand=StockableItem,Stock&$filter=isof(Stock,'YourModelName.Stock') and Location eq 1 

這不是你以後的確切對象圖,但是,除非你要開始添加鏈接客戶端,這是你會得到最好的。

1

從上面的查詢中不清楚你究竟想要做什麼。隨着WCF DS客戶端,您可以添加其中,通過屬性追溯條款:

from si in svc.StockableItems 
where si.Stock.Location == 1 
select si 
// Results in something like http://services.odata.org/Experimental/OData/OData.svc/Products?$filter=Category/Name eq 'Beverages' 

您也可以明確地做預先加載與展開方法或通過包括在您的投影:

svc.StockableItems.Expand("Stock").Where(si => si.Stock.Location == 1) // OR 
from si in svc.StockableItems 
where si.Stock.Location == 1 
select si, si.Stock 
// Results in something like http://services.odata.org/Experimental/OData/OData.svc/Products?$filter=Category/Name eq 'Beverages'&$expand=Category 
+0

感謝您的關注Mark,我已經更新了原始問題並提供了更多信息。 – 2012-07-17 19:25:59

+0

你試過了上面的'Expand'方法嗎?我不確定我們是否在您尋找的內容中斷開連接,或者您是否錯過了答案的這一部分。 'Expand'是EF中的'Include'的WCF DS等價物。 – 2012-07-17 20:08:02

+0

據我瞭解,Expand方法是DataServiceQuery 的成員,所以會轉換成OData查詢嗎?我已經放棄嘗試從客戶端運行此查詢,因爲我無法寫出可以完成這項工作的OData查詢。因此,由於StockableItems-> Stock是1 .. *關係si,所以我的服務操作沒有可參考的擴展名(如果我添加了它,我是不會創建OData查詢?)。 Stock.Location == 1不起作用,我不確定LinQ會怎麼樣? – 2012-07-18 09:38:41