示例#1
0
        public virtual Task <IResourceCollectionDocument> GetRecords(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var query           = _dbContext.Set <T>().AsQueryable();
            var sortExpressions = _sortExpressionExtractor.ExtractSortExpressions(request);

            return(_queryableResourceCollectionDocumentBuilder.BuildDocument(query, request, sortExpressions, cancellationToken));
        }
示例#2
0
        public virtual Task <IResourceCollectionDocument> GetRecords(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var sortExpressions = _sortExpressionExtractor.ExtractSortExpressions(request);
            var includes        = _includeExpressionExtractor.ExtractIncludeExpressions(request);
            var query           = QueryIncludeNavigationProperties(null, GetNavigationPropertiesIncludes <T>(includes));

            return(_queryableResourceCollectionDocumentBuilder.BuildDocument(query, request, sortExpressions, cancellationToken, includes));
        }
        public async Task <IJsonApiDocument> GetRelatedResourceDocument(string primaryResourceId, HttpRequestMessage request,
                                                                        CancellationToken cancellationToken)
        {
            var query = await GetRelatedQuery(primaryResourceId, cancellationToken);

            var includes        = GetIncludePaths();
            var sortExpressions = _sortExpressionExtractor.ExtractSortExpressions(request);

            if (sortExpressions == null || sortExpressions.Length < 1)
            {
                sortExpressions = GetDefaultSortExpressions();
            }
            return(await _queryableResourceCollectionDocumentBuilder.BuildDocument(query, request, sortExpressions, cancellationToken, includes)); // TODO: allow implementors to specify metadata
        }
        public virtual async Task <IResourceCollectionDocument> GetRecords(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var entityQuery    = GetQuery();
            var includePaths   = GetIncludePathsForQuery() ?? new Expression <Func <TDto, object> >[] { };
            var jsonApiPaths   = includePaths.Select(ConvertToJsonKeyPath).ToArray();
            var mappedQuery    = GetMappedQuery(entityQuery, includePaths);
            var sortationPaths = _sortExpressionExtractor.ExtractSortExpressions(request);

            if (sortationPaths == null || !sortationPaths.Any())
            {
                sortationPaths = GetDefaultSortExpressions();
            }

            return(await _queryableResourceCollectionDocumentBuilder.BuildDocument(mappedQuery, request, sortationPaths, cancellationToken, jsonApiPaths));
        }
示例#5
0
        public async Task <IJsonApiDocument> BuildDocument(object obj, HttpRequestMessage requestMessage,
                                                           CancellationToken cancellationToken)
        {
            var type = obj.GetType();

            // TODO: test includes
            var includeExpressions = _includeExpressionExtractor.ExtractIncludeExpressions(requestMessage);

            var queryableInterfaces = type.GetInterfaces();
            var queryableInterface  =
                queryableInterfaces.FirstOrDefault(
                    i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryable <>));

            if (queryableInterface != null)
            {
                var queryableElementType = queryableInterface.GenericTypeArguments[0];
                var buildDocumentMethod  =
                    _openBuildDocumentFromQueryableMethod.Value.MakeGenericMethod(queryableElementType);

                var sortExpressions = _sortExpressionExtractor.ExtractSortExpressions(requestMessage);

                dynamic materializedQueryTask = buildDocumentMethod.Invoke(_queryableResourceCollectionDocumentBuilder,
                                                                           new[] { obj, requestMessage, sortExpressions, cancellationToken, includeExpressions });

                return(await materializedQueryTask);
            }

            var isCollection          = false;
            var enumerableElementType = GetEnumerableElementType(type);

            if (enumerableElementType != null)
            {
                isCollection = true;
            }

            var linkBaseUrl = _baseUrlService.GetBaseUrl(requestMessage);

            if (isCollection)
            {
                var buildDocumentMethod =
                    _openBuildDocumentFromEnumerableMethod.Value.MakeGenericMethod(enumerableElementType);
                return
                    ((dynamic)buildDocumentMethod.Invoke(_resourceCollectionDocumentBuilder, new[] { obj, linkBaseUrl, new string[] { }, null, null }));
            }

            // Single resource object
            return(_singleResourceDocumentBuilder.BuildDocument(obj, linkBaseUrl, includeExpressions, null));
        }