2017-08-07 6 views
0

私はいくつかの数字がDBにテキストとして格納されているという奇妙な状況に陥っています。 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. 

それとも私が使用しようとすると(私はまだ右である1を把握しようとしているを与え、I本当に)の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'は配列なので、フィルタリングのためにラムダを使用する必要があります。今まで私はもっと助けることはできませんが、 '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のものです)質問の '$ metadata'部分はわかりません(申し訳ありません)。とにかく、私はラムダを試してみます、私はコードの中でいくつかを見てきました、おそらく彼らは理由のためにそこにいます。 – ytg

+0

ODataには、サービス記述、エンティティデータモデルを返すエンドポイント 'root/$ metadata'があります。そして '$ filter'はフィルタリングされるべきコレクションに対して実行されるべきです(これは私が" set "によってこれを意味するものです)。私があなたを助けることができるかどうか私に教えてください。 – mat3e

答えて

1

エラーがではなく、と表示されるため、投稿した内容から、ReferenceNumbersプロパティが配列であることがわかりました。アレイ上でフィルタリングするための

、あなたは(5.1.1.10 in the official OData documentation)ラムダ演算子を使用する必要があります。

  • any - 少なくとも1つのエントリは、条件と一致しなければならないとき
  • all - すべての配列エントリが一致しなければならないときそれら

lengthgtあなたのために働くはずです。例要求 - すべてのReferenceNumbersが100以上でなければならない:

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

関連する問題