2017-08-07 70 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')