OData 筛选器和 Guid 字段的问题
Posted
技术标签:
【中文标题】OData 筛选器和 Guid 字段的问题【英文标题】:Problems with an OData filter and a Guid field 【发布时间】:2011-04-22 20:19:41 【问题描述】:我正在尝试使用 OData 使一些代码正常工作。以下代码似乎不起作用。
ds 是 OpenDataServiceProxy。
adapterTypeId 是 Guid 的字符串表示形式。
adapterName 是字符串名称
ds.query('/DataAdapters?$filter=DataAdapterType.DataAdapterTypeId eq guid(\'' + adapterTypeId + '\') and Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, 'Error');
以上行给出以下错误:
“System.Boolean”类型的表达式应位于位置 0。
如果我删除过滤器的 Guid 部分,使其仅使用“名称”部分,它就可以正常工作。
DataAdapters 表字段“DataAdapterTypeId”是“DataAdapterTypes”表 DataAdapterTypeId 字段的外键。
谁能发现我做错了什么?
-------编辑----------
好的,我已经更改了过滤器,如下所示。我不再收到错误,而是返回了很多结果,而不是一条与过滤器匹配的记录。谁能说出为什么它没有过滤?
ds.query('/DataAdapters?($filter=Name eq \'' + adapterName + '\' and $filter=DataAdapterTypeId eq guid\'' + adapterTypeId + '\')', ifmgr_CreateAdapter_Step1, onGenericFailure, '');
【问题讨论】:
【参考方案1】:使用 OData v4 在 ASP.NET 上对我有用的是
'DataAdapterTypeId eq' + adapterTypeId
注意不要在 guid 值周围加上引号或强制转换。如果adapterTypeId
不是 GUID,它将引发错误。
【讨论】:
【参考方案2】:您可以找到更新后的 URL 约定参考 here。
【讨论】:
【参考方案3】:guid 值的格式需要像 guid'' - 详情请参阅:http://www.odata.org/developers/protocols/overview#AbstractTypeSystem 不知道你想用 DataAdapterType.DataAdatperTypeId 实现什么,但是点字符在过滤器表达式中没有特殊含义,所以它可能不会达到你想要的效果。如果您的 DataAdapters 实体集具有类型为 DataAdapterType 的实体,然后具有类型为 GUID 的属性 DataAdapterTypeId,那么您可以通过简单地对其进行过滤
DataAdapterTypeId eq guid'<value>'
【讨论】:
我进行了您推荐的更改,但现在我恢复了所有记录,而不仅仅是与过滤器匹配的记录。我已在原始问题中添加了详细信息。 不要在 $filters 周围加上括号。 如果您想要两个条件,请使用类似:$filter=Name eq 'foo' 和 Description eq 'bar' 语法在这里有完整的描述:odata.org/developers/protocols/uri-conventions @VitekKarasMSFT 这些链接似乎都不起作用了。以上是关于OData 筛选器和 Guid 字段的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OData 筛选器筛选 Azure 表存储中的布尔值?
Azure 逻辑应用 Odata 筛选查询,在两列上使用 if 语句
使用 OData Web Api 对数据传输对象进行嵌套筛选
S4 Hana Cloud-创建自定义CDSVIEW并发布OData服务使用