我有一张桌子"活动"使用链接表"注册",我想创建一个OData服务,该服务返回Events表中的记录,以及每个事件的注册数。数据将在JavaScript中以客户端方式使用,因此我希望保留返回数据的大小,而不是完全包含所有链接的注册记录。
例如:
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类),但是当我在实体集中包含Registrations表时,它就会出现神秘的服务器错误。 ("复杂类型' Models.Registration'是指实体类型' Models.Event'通过属性'事件'。")
我在构建WCF OData系统方面取得了更大的成功,并且可以请求相关注册的事件信息和信息。
但是,我不知道如何在事件结果集中包含聚合计数信息。我是否需要创建将成为OData服务源的自定义实体集?我可能在这里提供了太多的信息来寻找解决方案,但我真的不知道在哪里看。有人可以帮帮我吗?
答案 0 :(得分:2)
如果您愿意按Event
提出额外请求,则可以查询http://.../YourService.svc/Events(<key>)/Registrations/$count
(或http://.../YourService.svc/Events(<key>)/$links/Registrations?$inlinecount=allpages
,如果您还使用了Registration
的链接实体)。
这两种公共服务方法的例子:
http://services.odata.org/V3/OData/OData.svc/Suppliers(0)/Products/$count
我猜你希望这些信息与Events
响应的其余部分捆绑在一起。它并不理想,但您可以按照这些方式发出查询:
我正在展开Products
(类似于您的Registrations
)并选择Products/ID
以强制响应包含一个与嵌套{{1}大小相同的数组收集。我不关心Products
- 我只选择了一小块数据。通过此JSON响应,您的javascript客户端可以获取ID
数组的长度,并将其用作链接到给定Products
的{{1}}数。
(注意:要使用WCF数据服务进行服务支持Products
查询,您需要在初始化服务时包含此行:Supplier
)
编辑添加:如果您的服务器执行服务器驱动分页,则无法保证使用$ expand和$ select的方法能够为您提供正确的计数。通常,在OData v3中没有简单的单响应方式来执行您所要求的操作,但在OData v4中,使用新的扩展/选择语法可以实现这一点。
答案 1 :(得分:0)
您可以编辑您的活动模型并添加RegistrationCount属性吗?这是我认为最简单的方式
答案 2 :(得分:0)
我最终做的事实上非常简单;我在SQL Server中创建了一个View,它返回包含注册计数的表。从来没有想过使用视图,因为我以前从未使用它们......
答案 3 :(得分:0)
我正在使用oData v4,我使用了这种语法:
var url = '.../odata/clients?$expand=Orders($count=true)';
// ...
一个名为 Orders@odata.count 的字段已添加到包含正确计数的响应实体中。 现在要访问包含破折号的JSON属性,你必须这样做:
var ordersCount = response.value['Orders@odata.count'];
希望这会有所帮助。