2017-08-07 89 views
0

我处于奇怪的情况,我有一些数字作为文本存储在数据库中。不是很熟悉OData,我试图编写一个查询来处理这些字符串作为实际的数字。按OData长度过滤字段

$filter=(((length(Document/DocumentSet/ReferenceNumbers) ge 3) and (Document/DocumentSet/ReferenceNumbers gt '100'))) 

是我能想出的最好,但给了我一个ODataException

The argument for an invocation of a function with name 'length' is not a single value. All arguments for this function must be single values. 

或者,如果我尝试使用(我还在试图找出哪一个是正确的,我真不知道的OData):

$filter=(((length(Document/DocumentSet/ReferenceNumbers/Number) ge 3) and (Document/DocumentSet/ReferenceNumbers/Number gt '100'))) 

然后

The parent value for a property access of a property 'Number' is not a single value. Property access can only be applied to a single value. 

问题是:有什么方法可以按OData过滤一些东西吗?

+0

你可以添加一些信息:什么是组要筛选上(前'$ filter'部分)?这个集合元素的数据模型(来自'$ metadata'端点)是什么?我猜'ReferenceNumbers'是一个数组,所以你必须使用lambda进行过滤。到目前为止,我无法提供更多帮助,但lambda的'length'和'gt'可能已经足够。完整的操作列表(也有可用的投影):http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part2-url-conventions/odata-v4.0- errata03-os-part2-url-conventions-complete.html#_Toc453752358 – mat3e

+0

'$ filter'之前的部分不是一个集合,我相信。 (原始实现是非REST事物作为REST事物出售)问题的$元数据部分我甚至不明白(对不起)。无论如何,我会尝试lambda表达式,我在代码中看到了一些,可能他们出于某种原因。 – ytg

+0

在OData中有一个端点'root/$ metadata',它返回一个服务描述实体数据模型。 '$ filter'应该运行在一个要过滤的集合上(这就是我所说的“set”)。让我知道我是否可以帮助你。 – mat3e

回答

1

从你发布的内容中,我了解到ReferenceNumbers属性是一个数组,因为错误告诉没有一个值

有关阵列过滤,则需要使用的λ运算符(5.1.1.10 in the official OData documentation):

  • any - 当至少一个项具有相匹配的条件
  • all - 当所有的数组项必须匹配他们

然后lengthgt应该为你工作。例如要求 - 所有ReferenceNumbers应大于100:

root/set?$filter=Document/DocumentSet/ReferenceNumbers/any(refNum:refNum gt '100')