示例#1
0
        private OeAsyncEnumerator ExecuteGet(IEdmModel refModel, ODataUri odataUri, OeRequestHeaders headers, CancellationToken cancellationToken, IQueryable source)
        {
            var parser = new OeGetParser(refModel);

            _queryContext = parser.CreateQueryContext(odataUri, headers.MaxPageSize, headers.NavigationNextLink, headers.MetadataLevel);

            if (odataUri.Path.LastSegment is OperationSegment)
            {
                return(OeOperationHelper.ApplyBoundFunction(_queryContext));
            }

            if (source != null)
            {
                _queryContext.QueryableSource = e => e == _queryContext.EntryFactory.EntitySet ? source : null;
            }

            if (_queryContext.IsCountSegment)
            {
                headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                int count = _dataAdapter.ExecuteScalar <int>(_dataContext, _queryContext);
                return(new OeScalarAsyncEnumeratorAdapter(Task.FromResult((Object)count), cancellationToken));
            }

            return(_dataAdapter.ExecuteEnumerator(_dataContext, _queryContext, cancellationToken));
        }
        private IAsyncEnumerable <Object> ExecuteGet(IEdmModel refModel, ODataUri odataUri, OeRequestHeaders headers, IQueryable source)
        {
            if (_modelBoundProvider != null)
            {
                _modelBoundProvider.Validate(_edmModel, odataUri);
            }

            _queryContext = new OeQueryContext(refModel, odataUri)
            {
                MetadataLevel = headers.MetadataLevel
            };

            if (odataUri.Path.LastSegment is OperationSegment)
            {
                return(OeOperationHelper.ApplyBoundFunction(_queryContext));
            }

            if (source != null)
            {
                _queryContext.QueryableSource = e => e == _queryContext.EntryFactory.EntitySet ? source : null;
            }

            if (_queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                int count = _dataAdapter.ExecuteScalar <int>(_dataContext, _queryContext);
                return((IAsyncEnumerable <Object>)Infrastructure.AsyncEnumeratorHelper.ToAsyncEnumerable(Task.FromResult(count)));
            }

            return(_dataAdapter.Execute(_dataContext, _queryContext));
        }
示例#3
0
        public OeAsyncEnumerator ApplyBoundFunction(OeAsyncEnumerator asyncEnumerator, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.Path.LastSegment is OperationSegment operationSegment)
            {
                var        edmFunction = (IEdmFunction)operationSegment.Operations.First();
                MethodInfo methodInfo  = queryContext.EdmModel.GetMethodInfo(edmFunction);

                IReadOnlyList <KeyValuePair <String, Object> > parameterList = OeOperationHelper.GetParameters(
                    queryContext.EdmModel, operationSegment, queryContext.ODataUri.ParameterAliasNodes);

                Object boundParameter;
                Type   boundParameterType = methodInfo.GetParameters()[1].ParameterType;
                if (boundParameterType.IsGenericType && boundParameterType.GetGenericTypeDefinition() == typeof(IAsyncEnumerator <>))
                {
                    boundParameterType = boundParameterType.GetGenericArguments()[0];
                    Type            asyncEnumeratorAdapterType = typeof(OeAsyncEnumeratorAdapter <>).MakeGenericType(boundParameterType);
                    ConstructorInfo ctor = asyncEnumeratorAdapterType.GetConstructor(new[] { typeof(OeAsyncEnumerator) });
                    boundParameter = ctor.Invoke(new Object[] { asyncEnumerator });
                }
                else
                {
                    boundParameter = asyncEnumerator.MoveNextAsync().GetAwaiter().GetResult() ? asyncEnumerator.Current : null;
                }

                var parameters = new Object[parameterList.Count + 2];
                parameters[0] = queryContext.EdmModel;
                parameters[1] = boundParameter;
                for (int i = 2; i < parameters.Length; i++)
                {
                    parameters[i] = parameterList[i - 2].Value;
                }

                Object result = methodInfo.Invoke(null, parameters);
                if (result is IEnumerable enumerable)
                {
                    return(new OeAsyncEnumeratorAdapter(enumerable, asyncEnumerator.CancellationToken));
                }
                else
                {
                    return(new OeScalarAsyncEnumeratorAdapter(Task.FromResult(result), asyncEnumerator.CancellationToken));
                }
            }

            return(asyncEnumerator);
        }
        private IAsyncEnumerable <Object> ExecutePost(IEdmModel refModel, ODataUri odataUri, OeRequestHeaders headers, Stream requestStream, CancellationToken cancellationToken)
        {
            _odataUri = odataUri;

            var parser = new OePostParser(refModel, null);
            IAsyncEnumerable <Object> asyncEnumerable = parser.GetAsyncEnumerable(odataUri, requestStream, headers, _dataContext !, cancellationToken, out bool isScalar);

            if (!isScalar)
            {
                var           importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
                IEdmEntitySet?entitySet     = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());
                if (entitySet != null)
                {
                    _queryContext = parser.CreateQueryContext(odataUri, entitySet, headers.MetadataLevel);
                }
            }

            return(asyncEnumerable);
        }