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服务使用

Tableau:如何将下拉筛选器限制为以“2021*”开头的字段(每周添加一个新字段的财政周字段)?

tableau-交互筛选器