Asp.net mvc 4 在OData结果中包括链接记录的计数
我有一个带有链接表“Registrations”的表“Events”,我想创建一个OData服务,它返回Events表中的记录,以及每个事件的注册数。这些数据将在JavaScript中由客户端使用,因此我希望降低返回数据的大小,并且不完全包含所有链接的注册记录 例如:Asp.net mvc 4 在OData结果中包括链接记录的计数,asp.net-mvc-4,asp.net-web-api,wcf-data-services,odata,Asp.net Mvc 4,Asp.net Web Api,Wcf Data Services,Odata,我有一个带有链接表“Registrations”的表“Events”,我想创建一个OData服务,它返回Events表中的记录,以及每个事件的注册数。这些数据将在JavaScript中由客户端使用,因此我希望降低返回数据的大小,并且不完全包含所有链接的注册记录 例如: ID Title Date Regs 1 Breakfast 01.01.01 12:00 4 2 Party 01.01.01 20:00 20 我正在使用ASP.NE
ID Title Date Regs
1 Breakfast 01.01.01 12:00 4
2 Party 01.01.01 20:00 20
我正在使用ASP.NET MVC4构建服务。这些表位于MSSQL数据库中。我真的只是刚开始与小田和林克
我首先尝试使用WebAPI OData系统(使用EntitySetController类),但在实体集中包含Registrations表后,就出现了神秘的服务器错误。(“复杂类型“Models.Registration”通过属性“Event”引用实体类型“Models.Event”)
我更成功地构建了WCF OData系统,可以请求事件信息和相关注册信息
但是,我不知道如何在事件结果集中包含聚合计数信息。我是否需要创建一个自定义实体集作为OData服务的源?我可能在这里包含的信息太少,无法找到解决方案,但我真的不知道该去哪里查找。有人能帮我吗?如果您愿意为每个
事件
提出额外请求,您可以查询http://.../YourService.svc/Events()/Registrations/$count
(或http://.../YourService.svc/Events()/$links/Registrations?$inlinecount=allpages
如果您还使用到注册
实体的链接)
关于公共服务的这两种方法的示例:
我猜您更喜欢将此信息与其余的事件
响应捆绑在一起。这并不理想,但您可以按照以下方式发出查询:
我正在扩展产品
(类似于您的注册
),并选择产品/ID
,以强制响应包含与嵌套产品
集合大小相同的数组。我不在乎ID
——我只是选择了一段小数据。通过这个JSON响应,javascript客户端可以获得产品
数组的长度,并将其用作链接到给定供应商
的产品的数量
(注意:要使您的服务支持使用WCF数据服务进行$select
查询,您需要在初始化服务时包括此行:config.DataServiceBehavior.AcceptProjectionRequests=true;
)
编辑添加:如果您的服务器执行服务器驱动分页,则使用$expand和$select的方法不能保证为您提供正确的计数。一般来说,OData v3中没有一种简单的单一响应方式来满足您的要求,但在OData v4中,新的扩展/选择语法可以实现这一点。您可以编辑事件模型并添加RegistrationCount属性吗?这是我认为的最简单的方式,我最终做的其实很简单;我在SQLServer中创建了一个视图,该视图返回包含注册计数的表。从未想过使用视图,因为我以前从未使用过它们…我使用的是oData v4,我使用了以下语法:
var url = '.../odata/clients?$expand=Orders($count=true)';
// ...
一个名为Orders@odata.count已添加到包含正确计数的响应实体中。
现在要访问包含破折号的JSON属性,您必须这样做:
var ordersCount = response.value['Orders@odata.count'];
希望这有帮助。谢谢!我将在周二回来工作时尝试这两种方法。它们似乎是非常好的解决方案。我想我可以,但我不知道如何用注册表中的聚合计数填充该属性。。。