【问题标题】:Include count of linked records in OData result在 OData 结果中包含链接记录的计数
【发布时间】:2013-05-07 16:12:42
【问题描述】:

我有一个表“事件”和一个链接表“注册”,我想创建一个 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 服务源的自定义实体集?我可能在这里包含的信息太少,无法找到解决方案,但我真的不知道去哪里找。有人可以帮帮我吗?

【问题讨论】:

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


    【解决方案1】:

    如果您愿意针对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 数组的长度,并将其用作链接到给定 SupplierProducts 的数量。

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

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

    【讨论】:

    • 谢谢!我将在周二回到工作岗位时尝试这两种方法。它们似乎是非常好的解决方案。
    【解决方案2】:

    我正在使用 oData v4,我使用了这种语法:

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      你能编辑你的 Event 模型并添加一个 RegistrationCount 属性吗?这是我认为最简单的方法

      【讨论】:

      • 我想我可以,但我不知道如何用注册表中的汇总计数填充该属性...
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        /Parents$expand=Children($count=true;$top=0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-25
          • 2020-10-24
          • 1970-01-01
          • 2021-12-08
          • 2015-12-09
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多