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