protected override OrderByQueryPart Parse(string parameterValue)
        {
            // TODO: support complex order by expressions (e.g. "$orderby=(Id mod 3) desc")
            var matches = Regex.Matches(parameterValue, @"(\w+)\s+(asc|desc)", RegexOptions.IgnoreCase).Cast <Match>();

            var orderings = new List <ODataOrdering>();

            foreach (var match in matches)
            {
                var groups = match.Groups.Cast <Group>().Skip(1).ToList();

                var property = groups[0].Value;
                var dir      = groups[1].Value;

                ODataOrderingDirection direction;
                if (Enum.TryParse(dir, true, out direction) == false)
                {
                    // TODO: I'm pretty sure this branch will never be taken, but...
                    throw new ArgumentException(String.Format("'{0}' is not a valid ordering direction.", dir));
                }

                orderings.Add(ODataQueryPart.Ordering(property, direction));
            }

            return(ODataQueryPart.OrderBy(orderings.ToArray()));
        }
        public override void VisitOrdering(Ordering ordering, QueryModel queryModel, OrderByClause orderByClause, int index)
        {
            if (_query.OrderByPredicate == null)
            {
                _query.OrderByPredicate = ODataQueryPart.OrderBy();
            }

            if (ordering.Expression.NodeType == ExpressionType.MemberAccess)
            {
                var memberExpression = (MemberExpression)ordering.Expression;

                var direction = (ordering.OrderingDirection == OrderingDirection.Asc)
                                        ? ODataOrderingDirection.Asc
                                        : ODataOrderingDirection.Desc;

                var o = ODataQueryPart.Ordering(memberExpression.Member.Name, direction);

                _query.OrderByPredicate.AddOrdering(o);
            }

            base.VisitOrdering(ordering, queryModel, orderByClause, index);
        }