我正在尝试创建一个对odata webservice的调用,该调用只会选择某些属性的不同值。有没有很好的例子说明如何做到这一点?
答案 0 :(得分:29)
目前,OData协议不支持distinct运算符或任何其他有助于此类查询的运算符(假设您正在某个实体上查找原始属性的分辨值)。 您应该能够通过在服务器上实现服务操作来解决此问题,该服务器对通常具有该功能的基础提供程序执行此类查询。然后客户端可以调用该服务操作。
答案 1 :(得分:1)
注意:我知道这很旧,但仍然显示在搜索响应中。现在有一个很好的解决方案。
在OData v4中,支持$apply,除其他外,$apply
可用于从结果集中返回一组不同的字段。
请参阅相关讨论:Applying Distinct to ODataQuery
来自OData v4 spec,
查询选项$apply
采用一系列的设置转换,用正斜杠分隔以表示它们是连续应用的,例如每个转换的结果是下一个转换的输入 $ apply是需要的功能
tl; dr;
基本上,如果我有一个包含许多字段的表,但是我只想返回许多特定字段的不同记录,则第一步是识别不同的列,我们将它们称为Name
和{{1} }。
只需使用Id
函数即可获得一个独特的结果集,其中仅包含具有以下语法的Names和Id列:
$apply
让我们以示例的方式执行此操作,http://url.to/tableresource?$apply=groupby((Name,Id))
具有1000行,但是只有几个承包商,我想在下拉列表中显示承包商的名称以用于过滤查询。
我的不同列是TuberInspections
和ContractorName
ContractorId
如果数据结构不够平坦,则检索简单的嵌套结果结构的OOTB支持有限,当前使用以下语法仅支持单个导航路径。上面的查询也可以写成:
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"
}
]
}
嵌套或堆叠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
}
}
]
}
转换有更高级的(复杂的)变体,其中包括返回与每个不同结果相对应的唯一行数的计数。
有关更多信息,请发布特定问题并使用OData-v4进行标记,您将找到所需的所有帮助:)