Ejemplo n.º 1
0
            private void NestedExpand(ExpandClause clause)
            {
                var nestedParser = new ExpandClauseParser(_parser, clause.NestedExpands);

                clause.NestedExpandParameter = Expression.Parameter(clause.ItemType);
                nestedParser.Parse(clause.NestedExpandParameter);
            }
Ejemplo n.º 2
0
            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);
                    }
                }
            }
Ejemplo n.º 3
0
            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();
            }
Ejemplo n.º 4
0
 private void ExpandOrder(ExpandClause clause)
 {
     clause.Orderby = new OrderByQueryOption(clause.ItemType);
     clause.Orderby.Initialize(_parser, _modelStateDictionary);
 }
Ejemplo n.º 5
0
 private void ExpandFilter(ExpandClause clause)
 {
     clause.Filter = new FilterQueryOption(clause.ItemType);
     clause.Filter.Initialize(_parser, _modelStateDictionary);
 }
Ejemplo n.º 6
0
            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}");
                }
            }
Ejemplo n.º 7
0
            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}");
                }
            }