示例#1
0
        private string BuildUri(RestQueryableTreeParser parser, out LambdaExpression clientSideSelectPart)
        {
            clientSideSelectPart = null;
            var builder = new UriQueryBuilder();

            var resourceInfo = Client.GetResourceInfoForType(parser.ElementType);

            if (!resourceInfo.IsUriBaseType)
            {
                builder.AppendParameter("$oftype", resourceInfo.JsonTypeName);
            }

            SetProjection(parser, builder);

            if (parser.WherePredicate != null)
            {
                builder.AppendExpressionParameter("$filter", parser.WherePredicate);
            }
            if (parser.OrderKeySelectors.Count > 0)
            {
                builder.AppendExpressionParameter <QueryOrderByBuilder>("$orderby", Expression.Constant(parser.OrderKeySelectors));
            }
            if (parser.GroupByKeySelector != null)
            {
                builder.AppendExpressionParameter <QuerySelectorBuilder>("$groupby", parser.GroupByKeySelector);
            }
            if (parser.SelectExpression != null)
            {
                var selectNode  = parser.SelectExpression.Visit <ClientServerSplittingSelectBuilder>();
                var splitSelect = selectNode as ClientServerSplitSelectExpression;
                if (splitSelect != null)
                {
                    clientSideSelectPart = splitSelect.ClientSideExpression;
                    selectNode           = splitSelect.ServerExpression;
                }
                builder.AppendParameter("$select", selectNode);
            }

            if (parser.Projection == RestQueryableTreeParser.QueryProjection.Enumerable)
            {
                if (parser.SkipCount.HasValue)
                {
                    builder.AppendParameter("$skip", parser.SkipCount.Value);
                }
                builder.AppendParameter("$top", parser.TakeCount.GetValueOrDefault(int.MaxValue));
            }

            var expandedPaths = parser.ExpandedPaths;

            if (!string.IsNullOrEmpty(expandedPaths))
            {
                builder.AppendParameter("$expand", expandedPaths);
            }

            if (parser.IncludeTotalCount)
            {
                builder.AppendParameter("$totalcount", "true");
            }

            return(parser.RepositoryUri + "?" + builder);
        }