private void NestedExpand(ExpandClause clause) { var nestedParser = new ExpandClauseParser(_parser, clause.NestedExpands); clause.NestedExpandParameter = Expression.Parameter(clause.ItemType); nestedParser.Parse(clause.NestedExpandParameter); }
private void ExpandItem() { if (_parser.CurrentTokenKind == QueryExpressionTokenKind.Identifier) { var member = _parser.BindMember((string)_parser.TokenData); if (!(member is PropertyInfo property) || !IsNavigationProperty(property, out var itemType, out var isCollection)) { _parser.ReportError($"Property '{_parser.TokenData}' is no navigation property"); return; } if (_clauses.ContainsKey(property)) { _parser.ReportError($"Property '{_parser.TokenData}' is already expanded."); return; } var clause = new ExpandClause(itemType, property, isCollection); _clauses[property] = clause; _parser.NextToken(); if (_parser.CurrentTokenKind == QueryExpressionTokenKind.OpenParenthesis) { _parser.NextToken(); ExpandItemOptions(clause); } } }
private void ExpandSkip(ExpandClause clause) { if (!QueryExpressionParser.IsNumeric(_parser.CurrentTokenKind)) { _parser.ReportError( $"$expand($skip) does not specify a numerical value at position {_parser.Position}"); } clause.Skip = new SkipQueryOption(); clause.Skip.Initialize(_parser.TokenData.ToString(), _modelStateDictionary); _parser.NextToken(); }
private void ExpandOrder(ExpandClause clause) { clause.Orderby = new OrderByQueryOption(clause.ItemType); clause.Orderby.Initialize(_parser, _modelStateDictionary); }
private void ExpandFilter(ExpandClause clause) { clause.Filter = new FilterQueryOption(clause.ItemType); clause.Filter.Initialize(_parser, _modelStateDictionary); }
private void ExpandItemOptions(ExpandClause clause) { while (_parser.CurrentTokenKind == QueryExpressionTokenKind.Identifier) { var option = (string)_parser.TokenData; Action <ExpandClause> handler; switch (option) { case "$filter": handler = ExpandFilter; break; case "$expand": handler = NestedExpand; break; case "$orderby": handler = ExpandOrder; break; case "$top": handler = ExpandTop; break; case "$skip": handler = ExpandSkip; break; default: handler = null; break; } ; if (handler != null) { _parser.NextToken(); if (_parser.CurrentTokenKind != QueryExpressionTokenKind.Equal) { _parser.ReportError($"Expected equals sign after $expand option {option}"); } _parser.NextToken(); handler(clause); if (_parser.CurrentTokenKind == QueryExpressionTokenKind.CloseParenthesis) { break; } if (_parser.CurrentTokenKind == QueryExpressionTokenKind.Semicolon) { _parser.NextToken(); } } else { break; } } if (_parser.CurrentTokenKind != QueryExpressionTokenKind.CloseParenthesis) { _parser.ReportError($"Expected close parenthesis at position {_parser.Position}"); } }
private void ExpandItemOptions(ExpandClause clause) { while (_parser.CurrentTokenKind == QueryExpressionTokenKind.Identifier) { var option = (string)_parser.TokenData; Action <ExpandClause> handler; if (QueryOptionKeys.FilterKeys.Contains(option)) { handler = ExpandFilter; } else if (QueryOptionKeys.ExpandKeys.Contains(option)) { handler = NestedExpand; } else if (QueryOptionKeys.OrderbyKeys.Contains(option)) { handler = ExpandOrder; } else if (QueryOptionKeys.TopKeys.Contains(option)) { handler = ExpandTop; } else if (QueryOptionKeys.SkipKeys.Contains(option)) { handler = ExpandSkip; } else { handler = null; } if (handler != null) { _parser.NextToken(); if (_parser.CurrentTokenKind != QueryExpressionTokenKind.Equal) { _parser.ReportError($"Expected equals sign after $expand option {option}"); } _parser.NextToken(); handler(clause); if (_parser.CurrentTokenKind == QueryExpressionTokenKind.CloseParenthesis) { break; } if (_parser.CurrentTokenKind == QueryExpressionTokenKind.Semicolon) { _parser.NextToken(); } } else { break; } } if (_parser.CurrentTokenKind != QueryExpressionTokenKind.CloseParenthesis) { _parser.ReportError($"Expected close parenthesis at position {_parser.Position}"); } }