2.2.3.6.1.1 Common Expression Syntax
The Filter and OrderBy query options are specified in the data service URI via the common expression syntax defined in following Augmented BNF for query option expressions listing.
-
commonExpression = [WSP] (boolCommonExpression / methodCallExpression / parenExpression / literalExpression / addExpression / subExpression / mulExpression / divExpression / modExpression / negateExpression / memberExpression / firstMemberExpression / castExpression / functionCallExpression ) [WSP] boolCommonExpression = [WSP] (boolLiteralExpression / andExpression / orExpression / boolPrimitiveMemberExpression / eqExpression / neExpression / ltExpression / leExpression / gtExpression / geExpression / notExpression / isofExpression/ boolCastExpression / boolMethodCallExpression / firstBoolPrimitiveMemberExpression / boolParenExpression / boolFunctionCallExpression) [WSP] parenExpression = "(" [WSP] commonExpression [WSP] ")" boolParenExpression = "(" [WSP] boolCommonExpression [WSP] ")" andExpression = boolCommonExpression WSP "and" WSP boolCommonExpression orExpression = boolCommonExpression WSP "or" WSP boolCommonExpression eqExpression = commonExpression WSP "eq" WSP commonExpression neExpression = commonExpression WSP "ne" WSP commonExpression ltExpression = commonExpression WSP "lt" WSP commonExpression leExpression = commonExpression WSP "le" WSP commonExpression gtExpression = commonExpression WSP "gt" WSP commonExpression geExpression = commonExpression WSP "ge" WSP commonExpression addExpression = commonExpression WSP "add" WSP commonExpression subExpression = commonExpression WSP "sub" WSP commonExpression mulExpression = commonExpression WSP "mul" WSP commonExpression divExpression = commonExpression WSP "div" WSP commonExpression modExpression = commonExpression WSP "mod" WSP commonExpression negateExpression = "-" [WSP] commonExpression notExpression = "not" WSP commonExpression isofExpression = "isof" [WSP] "("[[WSP] commonExpression [WSP] ","][WSP] stringUriLiteral [WSP] ")" castExpression = "cast" [WSP] "("[[WSP] commonExpression [WSP] ","][WSP] stringUriLiteral [WSP] ")" boolCastExpression = "cast" [WSP] "("[[WSP] commonExpression [WSP] ","][WSP] "Edm.Boolean" [WSP] ")" firstMemberExpression = [WSP] [namespaceQualifiedEnitityType "/"] [lambdaPredicatePrefixExpression] ; A lambdaPredicatePrefixExpression is only defined inside a ; lambdaPredicateExpression. A lambdaPredicateExpression is required ; inside a lambdaPredicateExpression. entityNavProperty / ; section 2.2.3.1 entityComplexProperty / ; section 2.2.3.1 entityProperty / ; section 2.2.3.1 entityCollectionProperty ; section 2.2.3.1 firstBoolPrimitiveMemberExpression = [namespaceQualifiedEntityType "/"]entityProperty ; section 2.2.3.1 memberExpression = commonExpression [WSP] "/" [WSP] [namespaceQualifiedEntityType "/"] entityNavProperty / ; section 2.2.3.1 entityComplexProperty / ; section 2.2.3.1 entityProperty / ; section 2.2.3.1 entityCollectionProperty ; section 2.2.3.1 boolPrimitiveMemberExpression = commonExpression [WSP] "/" [WSP] [namespaceQualifiedEntityType "/"]entityProperty ; section 2.2.3.1 literalExpression = stringUriLiteral ; section 2.2.2 / dateTimeUriLiteral ; section 2.2.2 / dateTimeOffsetUriLiteral ; section 2.2.2 / timeUriLiteral ; section 2.2.2 / decimalLiteral ; section 2.2.2 / guidUriLiteral ; section 2.2.2 / singleLiteral ; section 2.2.2 / doubleLiteral ; section 2.2.2 / int16Literal ; section 2.2.2 / int32Literal ; section 2.2.2 / int64Literal ; section 2.2.2 / binaryLiteral ; section 2.2.2 / nullLiteral ; section 2.2.2 / byteLiteral ; section 2.2.2 / fullPointLiteral ; section 2.2.2 / fullLineStringLiteral ; section 2.2.2 / fullPolygonLiteral ; section 2.2.2 / fullGeoCollectionLiteral ; section 2.2.2 / fullMultiPointLiteral ; section 2.2.2 / fullMultiLineStringLiteral ; section 2.2.2 / fullMultiPolygonLiteral ; section 2.2.2 boolLiteralExpression = boolLiteral ; section 2.2.2 methodCallExpression = boolMethodCallExpression / indexOfMethodCallExpression / replaceMethodCallExpression / toLowerMethodCallExpression / toUpperMethodCallExpression / trimMethodCallExpression / substringMethodCallExpression / concatMethodCallExpression / lengthMethodCallExpression / yearMethodCallExpression / monthMethodCallExpression / dayMethodCallExpression / hourMethodCallExpression / minuteMethodCallExpression / secondMethodCallExpression / roundMethodCallExpression / floorMethodCallExpression / ceilingMethodCallExpression / distanceMethodCallExpression / geoLengthMethodCallExpression boolMethodCallExpression = endsWithMethodCallExpression / startsWithMethodCallExpression / substringOfMethodCallExpression / intersectsMethodCallExpression / anyMethodCallExpression / allMethodCallExpression endsWithMethodCallExpression = "endswith" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" indexOfMethodCallExpression = "indexof" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" replaceMethodCallExpression = "replace" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" startsWithMethodCallExpression = "startswith" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" toLowerMethodCallExpression = "tolower" [WSP] "(" [WSP] commonexpression [WSP] ")" toUpperMethodCallExpression = "toupper" [WSP] "(" [WSP] commonexpression [WSP] ")" trimMethodCallExpression = "trim" [WSP] "(" [WSP] commonexpression [WSP] ")" substringMethodCallExpression = "substring" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] [ "," [WSP] commonexpression [WSP] ] ")" substringOfMethodCallExpression = "substringof" [WSP] "(" [WSP] commonexpression [WSP] [ "," [WSP] commonexpression [WSP] ] ")" concatMethodCallExpression = "concat" [WSP] "(" [WSP] commonexpression [WSP] [ "," [WSP] commonexpression [WSP] ] ")" lengthMethodCallExpression = "length" [WSP] "(" [WSP] commonexpression [WSP] ")" getTotalOffsetMinutesMethodCallExpression = "gettotaloffsetminutes" [WSP] "(" [WSP] commonexpression [WSP] ")" yearMethodCallExpression = "year" [WSP] "(" [WSP] commonexpression [WSP] ")" monthMethodCallExpression = "month" [WSP] "(" [WSP] commonexpression [WSP] ")" dayMethodCallExpression = "day" [WSP] "(" [WSP] commonexpression [WSP] ")" hourMethodCallExpression = "hour" [WSP] "(" [WSP] commonexpression [WSP] ")" minuteMethodCallExpression = "minute" [WSP] "(" [WSP] commonexpression [WSP] ")" secondMethodCallExpression = "second" [WSP] "(" [WSP] commonexpression [WSP] ")" roundMethodCallExpression = "round" [WSP] "(" [WSP] commonexpression [WSP] ")" floorMethodCallExpression = "floor" [WSP] "(" [WSP] commonexpression [WSP] ")" ceilingMethodCallExpression = "ceiling" [WSP] "(" [WSP] commonexpression [WSP] ")" distanceMethodCallExpression = "geo.distance" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" geoLengthMethodCallExpression = "geo.length" [WSP] "(" [WSP] commonexpression [WSP] ")" intersectsMethodCallExpression = "geo.intersects" [WSP] "(" [WSP] commonexpression [WSP] "," [WSP] commonexpression [WSP] ")" implicitVariableExpression = "$it" ; references the unnamed outer variable of the query lambdaVariableExpression = *pchar ; section 3.3 of [RFC3986] ; a identifier/name that complies with EDM identifier rules lambdaPredicatePrefixExpression = inscopeVariableExpression "/" lambdaPredicateExpression = boolCommonExpression ; this is a boolCommonExpression with the added restriction that any ; firstMemberExpression expressions that are inside the methodPredicateExpression ; MUST have a prefix of lambdaPredicatePrefixExpression. inscopeVariableExpression = implicitVariableExpression | lambdaVariableExpression ; the lambdaVariableExpression must be the name of a variable introduced by either the ; current lambdaMethodCallExpression’s lambdaVariableExpression or via a wrapping ; lambdaMethodCallExpression’s lambdaVariableExpression. lambdaMethodCallExpression = anyMethodCallExpression | allMethodCallExpression. anyMethodCallExpression = pathExpression-collection "/" "any" "(" [ lambdaVariableExpression ":" lambdaPredicateExpression ] ")" allMethodCallExpression = pathExpression-collection "/" "all" "(" lambdaVariableExpression ":" lambdaPredicateExpression ")" singlePathExpression = [WSP] "("singlePathExpression / inscopeVariableExpression "/" entityNavProperty-et | entityComplexProperty collectionPathExpression = [WSP] commonexpression [WSP] singlePathExpression / inscopeVariableExpression "/" (entityNavProperty-es | entityCollectionProperty) functionCallExpression = [ ( memberExpression / firstMemberExpression ) "/"] functionFQName ; section 2.2.3.1 "(" [functionParametersExpression] ")" boolFunctionCallExpression = functionCallExpression ; with the added restriction that the specified FunctionImport ; has a ReturnType of Edm.Boolean functionParametersExpression = functionParameterExpression *( "," functionParameterExpression) functionParameterExpression = [WSP] functionParameterName ; section 2.2.3.1 [WSP] "=" [WSP] literalExpression / structuralValue / entityReference [WSP] structuralValue = ; a JSON or Verbose JSON encoding of a complex type, multi-value, ; entity, or collection of entities entityReference = "KEY(" [ entityContainer "." ] entitySet "("keyPredicate")" ")" ["/" namespaceQualifiedEntityType ] ; refers a single Entity by key, and optionally allows a cast to a ; derived type.
Listing: Augmented BNF for Query Option Expressions
A data service MAY<7> support some or all of the boolCommonExpression expressions for the Filter ($filter) system query option. A data service MAY<8> support some or all of the commonExpression expressions for the OrderBy ($orderby) query option.
If a data service does not support a given expression, it MUST reject any requests which contain the unsupported expression.
A data service MAY reject any requests that contain expressions not defined in this document.
Common expressions SHOULD be constructed and evaluated according to the rules defined in common expression syntax for each specific expression type.