使用odata选择不同的值

使用odata选择不同的值,odata,Odata,我正在尝试创建对ODataWebService的调用,该调用将只选择某些属性的不同值。有没有什么好的例子可以说明如何做到这一点?目前OData协议不支持distinct运算符或任何其他有助于此类查询的运算符(假设您正在查找某个实体上的基元属性的distinct值)。 您应该能够通过在服务器上实现服务操作来解决这个问题,该服务器在通常具有此功能的基础提供程序上执行此类查询。然后客户端可以调用该服务操作。注意:我知道这是旧的,但仍然显示在搜索响应中。这个问题现在有了一个很好的解决办法 在ODataV

我正在尝试创建对ODataWebService的调用,该调用将只选择某些属性的不同值。有没有什么好的例子可以说明如何做到这一点?

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

注意:我知道这是旧的,但仍然显示在搜索响应中。这个问题现在有了一个很好的解决办法

在ODataV4中,除其他外,还支持使用$apply从结果集中返回一组不同的字段

见相关讨论:

从,
查询选项
$apply
采用一系列设置转换,以斜杠分隔,表示它们是连续应用的,例如,每个转换的结果是下一个转换的输入 $apply是一个需要

tl;博士
基本上,如果我有一个包含许多字段的表,但我只想返回一些特定字段的不同记录,那么第一步是识别不同的列,让我们将它们称为
Name
Id

只需使用
$apply
函数即可获得一个独特的结果集,其中只包含名称和Id列,语法如下:

http://url.to/tableresource?$apply=groupby((Name,Id))
例如,
TuberInspections
有1000行,但只有少数承包商,我想在下拉列表中显示承包商的名称,以便在过滤查询中使用

我的不同列是
ContractorName
ContractorId

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"
            }
        ]
    }
如果您的数据结构不够扁平,则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
                 }
             }
         ]
    } 
嵌套或堆叠的
$apply
转换有更高级(复杂)的变体,包括返回对应于每个不同结果的唯一行数的计数

包括组内不同记录的
$count
在这里有点像文档记录,并且是为了响应

GroupBy支持一个,因此我们可以在前面的URL中使用它,请记住为投影的列名别名

分组依据((承包商/实体ID、承包商/首字母缩写)、合计(计为项目))

现在,响应包括计数:

       {
            "@odata.id": null,
            "Items": 260,
            "Contractor": {
                "@odata.id": null,
                "Initials": "SW",
                "EntityID": 11539
            }
        },

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

截至2014年2月24日,OData 4.0仍适用于2017年:'(2018年仍适用:'(2019年仍适用:'(2021年仍适用:'(可能的重复似乎类似于使用select a,b group by a,b来获得应该是select DISTINCE a,b的内容。我仍然喜欢DISTINCE运算符的概念-我不想实现数据转换服务。本质上,distinct和group by占用相同的服务器资源,并且是相同的计算,只有一种响应类型涵盖了这两种情况。问题是如何在规范中定义标准响应。在许多使用不同查询的情况下,让匹配项的计数是有用的,如果结构没有改变,那么作为OData规范的一部分,必须假设每一行在对应的资源,但由于我们只请求了唯一值,因此没有唯一键。如果您可以控制服务代码,请务必创建一个只返回所需的不同记录集的函数:)此响应更多的是关于如何查询现有或第三方API以获取不同的记录集。为了便于客户端使用,我100%支持自定义终结点。@Chrischaller在倒数第二段中提到,您还可以返回唯一行的计数。您能告诉我该url是什么样子吗在odata文档$apply中查找它时遇到的问题不在Dynamics 365支持的查询选项列表中: