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); }