在OData结果中包括链接记录的计数

时间:2013-05-13 15:02:35

标签: asp.net-mvc-4 asp.net-web-api wcf-data-services odata

我有一张桌子"活动"使用链接表"注册",我想创建一个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服务源的自定义实体集?我可能在这里提供了太多的信息来寻找解决方案,但我真的不知道在哪里看。有人可以帮帮我吗?

4 个答案:

答案 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

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以强制响应包含一个与嵌套{{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'];

希望这会有所帮助。