2013-05-13 45 views
1

我已經有一個帶有「註冊」鏈接表的「事件」表,並且我想創建一個從「事件」表中返回記錄的OData服務,以及註冊的數量每個事件。數據將在JavaScript中用於客戶端,因此我希望保持返回數據的大小,並且不要完全包含所有鏈接的註冊記錄。在OData結果中包括鏈接記錄的計數

例如:

ID Title  Date   Regs 
1 Breakfast 01.01.01 12:00 4 
2 Party  01.01.01 20:00 20 

我正在創建的服務與ASP.NET MVC4。這些表位於MSSQL數據庫中。我真的剛剛開始使用OData和LINQ。

我試着先使用WebAPI OData系統(使用EntitySetController類),但一旦將實體集合中的註冊表包含在內,就會得到神祕的服務器錯誤。 (「複雜類型'Models.Registration'通過屬性'Event'指實體類型'Models.Event'。」)

我已經更成功地構建了一個WCF OData系統,並且可以請求事件信息和信息在相關的註冊。

但是,我不知道如何將聚合計數信息包含在事件結果集中。我是否需要創建一個將成爲OData服務源的自定義實體集?我可能在這裏包含太多小信息來尋找解決方案,但我並不知道在哪裏尋找。有人能幫助我嗎?

回答

0

我最終做的其實很簡單;我在SQL Server中創建了一個視圖,該視圖返回包含註冊計數的表。從來沒有想過使用視圖,因爲我從來沒有使用過他們......我使用

2

如果你願意讓每Event一個額外的要求,你(如果你還使用鏈接到Registration實體或http://.../YourService.svc/Events(<key>)/$links/Registrations?$inlinecount=allpages)可以查詢http://.../YourService.svc/Events(<key>)/Registrations/$count

這兩種方法對公共服務

例子:

http://services.odata.org/V3/OData/OData.svc/Suppliers(0)/Products/$count

http://services.odata.org/V3/OData/OData.svc/Suppliers(0)/$links/Products?$inlinecount=allpages&$format=json

我猜你會喜歡這個信息來與Events其餘捆綁在一起儘管迴應。這不是理想的,但你可以發出沿着這些路線的查詢:

http://services.odata.org/V3/OData/OData.svc/Suppliers?$format=json&$expand=Products&$select=Products/ID,*

我擴大Products(類似於你Registrations),併爲了迫使響應包括陣列是選擇Products/ID與嵌套的Products集合大小相同。我不在乎ID - 我只是選擇了一小部分數據。通過這個JSON響應,您的javascript客戶端可以獲得Products陣列的長度,並將其用作鏈接到給定的SupplierProducts的編號。

(注:對你的服務支持使用WCF數據服務$select查詢,你需要加入這一行,當你初始化服務:config.DataServiceBehavior.AcceptProjectionRequests = true;

編輯補充:使用$該方法擴大和$如果您的服務器執行服務器驅動分頁,選擇將不能保證給您正確的計數。一般來說,沒有一種簡單的單一響應方式可以滿足您在OData v3中的要求,但在OData v4中,使用新的擴展/選擇語法可以實現這一點。

+0

謝謝!週二,當我回到工作崗位時,我會試試這兩種方法。他們似乎是非常好的解決方案。 – Peter 2013-05-19 16:36:39

0

你能編輯你的事件模型並添加一個RegistrationCount屬性嗎?這是我認爲最簡單的方式

+0

我想我可以,但我不知道如何用註冊表中的聚合計數填充該屬性... – Peter 2013-05-19 16:37:52

0

的OData v4和我用這個語法:

var url = '.../odata/clients?$expand=Orders($count=true)'; 
// ... 

場稱爲[email protected]已被添加到包含正確計數的響應實體。 現在訪問包含你有一個破折號像這樣做的JSON屬性:

var ordersCount = response.value['[email protected]']; 

希望這會有所幫助。