private static IEnumerable <IExpression> GetExpressions(QueryItem table, QuerySpan tokens, ParseContext context) { for (var i = tokens.Start; i < tokens.Start + tokens.Length; i++) { var token = tokens.List[i]; switch (token.Type) { case ODataTokenType.Parameter: yield return(new ParameterReference(token.Text.Substring(1), false)); break; case ODataTokenType.Date: case ODataTokenType.TimeOfDay: var dateText = token.Text; if (dateText.StartsWith("datetime'")) { dateText = dateText.Substring(9).TrimEnd('\''); } if (!ZonedDateTime.TryParse(dateText, table.Context.GetTimeZone(), out var date)) { throw new InvalidOperationException(); } yield return(new DateTimeLiteral(date.LocalDateTime)); break; case ODataTokenType.Decimal: yield return(new FloatLiteral((double)((decimal)token.AsPrimitive()))); break; case ODataTokenType.Single: yield return(new FloatLiteral((double)((float)token.AsPrimitive()))); break; case ODataTokenType.Double: case ODataTokenType.NaN: case ODataTokenType.NegInfinity: case ODataTokenType.PosInfinity: yield return(new FloatLiteral((double)token.AsPrimitive())); break; case ODataTokenType.False: yield return(new BooleanLiteral(false)); break; case ODataTokenType.Guid: yield return(new StringLiteral(((Guid)token.AsPrimitive()).ToArasId())); break; case ODataTokenType.Integer: yield return(new IntegerLiteral((int)token.AsPrimitive())); break; case ODataTokenType.Long: yield return(new IntegerLiteral((long)token.AsPrimitive())); break; case ODataTokenType.String: yield return(new StringLiteral((string)token.AsPrimitive())); break; case ODataTokenType.True: yield return(new BooleanLiteral(true)); break; case ODataTokenType.Null: yield return(new NullLiteral()); break; case ODataTokenType.Identifier: if (string.Equals(context.Name, "$compute", StringComparison.OrdinalIgnoreCase) && string.Equals(tokens.List[i].Text, "as", StringComparison.OrdinalIgnoreCase)) { yield return(new SelectExpression()); } else { yield return(TryGetProperty(tokens.List, ref i, table, context)); } break; case ODataTokenType.And: yield return(new AndOperator()); break; case ODataTokenType.Or: yield return(new OrOperator()); break; case ODataTokenType.Equal: yield return(new EqualsOperator()); break; case ODataTokenType.NotEqual: yield return(new NotEqualsOperator()); break; case ODataTokenType.LessThan: yield return(new LessThanOperator()); break; case ODataTokenType.LessThanOrEqual: yield return(new LessThanOrEqualsOperator()); break; case ODataTokenType.GreaterThan: yield return(new GreaterThanOperator()); break; case ODataTokenType.GreaterThanOrEqual: yield return(new GreaterThanOrEqualsOperator()); break; case ODataTokenType.In: yield return(new InOperator()); break; case ODataTokenType.Add: yield return(new AdditionOperator()); break; case ODataTokenType.Subtract: yield return(new SubtractionOperator()); break; case ODataTokenType.Multiply: yield return(new MultiplicationOperator()); break; case ODataTokenType.Divide: yield return(new DivisionOperator()); break; case ODataTokenType.Modulo: yield return(new ModulusOperator()); break; case ODataTokenType.Not: yield return(new NotOperator()); break; case ODataTokenType.Negate: yield return(new NegationOperator()); break; case ODataTokenType.Star: yield return(new AllProperties(table)); break; case ODataTokenType.OpenParen: yield return(new ListExpression()); break; case ODataTokenType.CloseParen: yield return(new EndParen()); break; case ODataTokenType.Comma: yield return(new Comma()); break; case ODataTokenType.Base64: case ODataTokenType.Binary: case ODataTokenType.Duration: case ODataTokenType.Has: case ODataTokenType.Navigation: throw new NotSupportedException(); default: //return new IgnoredNode(token); break; } } }