2

我有一个带有链接表“注册”的表“事件”,我想创建一个 OData 服务,该服务从事件表中返回记录,以及每个事件的注册数。数据将在 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'通过属性'Event'引用实体类型'Models.Event'。”)

我在构建 WCF OData 系统方面取得了更大的成功,并且可以请求事件信息和相关注册信息。

但是,我不知道如何在事件结果集中包含聚合计数信息。我是否需要创建将作为 OData 服务源的自定义实体集?我可能在这里包含的信息太少,无法找到解决方案,但我真的不知道去哪里找。有人可以帮助我吗?

4

5 回答 5

2

如果您愿意为 per 提出额外的请求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以强制响应包含与嵌套Products集合大小相同的数组。我不在乎ID——我只是选择了一个很小的数据。使用此 JSON 响应,您的 javascript 客户端可以获取数组的长度Products并将其用作Products链接到给定Supplier.

(注意:要让您的服务支持$select使用 WCF 数据服务进行查询,您需要在初始化服务时包含此行config.DataServiceBehavior.AcceptProjectionRequests = true;:)

编辑添加:如果您的服务器执行服务器驱动分页,则无法保证使用 $expand 和 $select 的方法为您提供正确的计数。通常,在 OData v3 中没有简单的单一响应方式来执行您所要求的操作,但在 OData v4 中,这将通过新的展开/选择语法实现。

于 2013-05-13T18:29:07.107 回答
1

我正在使用 oData v4,我使用了以下语法:

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

一个名为Orders@odata.count的字段已添加到包含正确计数的响应实体中。现在要访问包含破折号的 JSON 属性,您必须这样做:

var ordersCount = response.value['Orders@odata.count'];

希望这可以帮助。

于 2016-12-14T09:47:28.077 回答
0

我最终做的其实很简单;我在 SQL Server 中创建了一个返回包含注册计数的表的视图。从来没有想过使用视图,因为我以前从未使用过它们......

于 2013-06-10T15:38:15.723 回答
0

您可以编辑您的 Event 模型并添加 RegistrationCount 属性吗?那是我认为最简单的方法

于 2013-05-14T05:23:59.853 回答
0

我用它来获取计数而不返回实体:

/Parents$expand=Children($count=true;$top=0)
于 2022-02-04T12:31:58.897 回答