使用odata选择不同的值

igo*_*rti 25 odata

我正在尝试创建一个对odata webservice的调用,该调用只会选择某些属性的不同值.有什么好的例子说明如何做到这一点?

Vit*_*SFT 30

目前,OData协议不支持不同的运算符或任何其他有助于此类查询的运算符(假设您在某个实体上查找原始属性的分辨值).您应该能够通过在服务器上实现服务操作来解决此问题,该服务器对通常具有该功能的基础提供程序执行此类查询.然后客户端可以调用该服务操作.

  • 2022 年仍然如此:'( (13认同)
  • 截至2014年2月24日,Odata 4.0仍然如此 (10认同)
  • 2023 年仍然如此:'( (8认同)
  • 2017年仍然如此:'( (6认同)
  • 2021 年仍然如此:'( (3认同)

Chr*_*ler 18

注意:我知道这是旧的,但仍然出现在搜索响应中。现在有一个很好的解决方案来解决这个问题。

在 OData v4 中,支持$apply,除其他外,$apply可用于从结果集中返回一组不同的字段。

参见相关讨论:Applying Distinct to ODataQuery

来自OData v4 规范
查询选项$apply采用一组转换序列,由正斜杠分隔以表示它们是连续应用的,例如,每个转换的结果是下一个转换的输入 $apply 是一个需要的函数

tl;博士;
基本上,如果我有一个包含许多字段的表,但我只想返回许多特定字段的不同记录,第一步是识别不同的列,让我们调用它们NameId
只需使用该$apply函数即可获得仅包含 Names 和 Id 列的独特结果集,其语法如下:

http://url.to/tableresource?$apply=groupby((Name,Id))
Run Code Online (Sandbox Code Playgroud)

让我们举个例子,TuberInspections有 1000 行,但只有几个承包商,我想在下拉列表中显示承包商的姓名以用于过滤查询。

我的不同列是ContractorNameContractorId

GET /odata/TuberInspections?$apply=groupby((ContractorName,ContractorId)) HTTP/1.1
Host: localhost:1230

Response:
    { 
        "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(ContractorName,ContractorId)",
        "value": [
            {
                "@odata.id": null,
                "ContractorId": 11534,
                "ContractorName": "Kermit d'Frog"
            },
            {
                "@odata.id": null,
                "ContractorId": 11539,
                "ContractorName": "Carlos Spicy Wiener"
            },
            {
                "@odata.id": null,
                "ContractorId": 16827,
                "ContractorName": "Jen Gelfling"
            }
        ]
    }
Run Code Online (Sandbox Code Playgroud)

如果您的数据结构不够扁平,则检索简单嵌套结果结构的 OOTB 支持有限。

如果他的数据结构难以使用并且你可以控制 API,那么你应该考虑创建一个自定义函数来返回你想要的特定记录集,这是一个微不足道的练习,有许多不同的选项可供你使用,但在本回复的范围。

此响应针对如何查询现有 OData 服务的不同值,而不是如何修改服务以提供此类信息。

当前,以下语法仅支持单个导航路径。上面的查询也可以写成:

GET /odata/TuberInspections?$apply=groupby((Contractor/EntityID,Contractor/Initials))
Host: localhost:1230

Response:
    { 
         "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(Contractor(EntityID,Initials))",
         "@odata.count": 3,
         "value": [
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "KdF",
                     "EntityID": 11534
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "SW",
                     "EntityID": 11539
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "Jen",
                     "EntityID": 16827
                 }
             }
         ]
    } 
Run Code Online (Sandbox Code Playgroud)

嵌套或堆叠$apply转换有更高级(复杂)的变体,包括返回与每个不同结果对应的唯一行数的计数。

$count在组中包含一个不同的记录在此处记录系统查询选项 $apply - groupby并响应OData v4 groupby with $count

GroupBy 支持聚合扩展,因此我们可以在之前的 URL 中使用它,记住为投影列名设置别名

groupby((Contractor/EntityID,Contractor/Initials),aggregate($count as Items))

响应现在包括计数:

       {
            "@odata.id": null,
            "Items": 260,
            "Contractor": {
                "@odata.id": null,
                "Initials": "SW",
                "EntityID": 11539
            }
        },
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请发布特定问题并使用 OData-v4 进行标记,您将找到所需的所有帮助:)