Asp.net mvc 4 在OData结果中包括链接记录的计数

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

我有一个带有链接表“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.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'];

希望这有帮助。

谢谢!我将在周二回来工作时尝试这两种方法。它们似乎是非常好的解决方案。我想我可以,但我不知道如何用注册表中的聚合计数填充该属性。。。