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));
        }
Esempio n. 2
0
        public async Task ExecuteAsync(ODataUri odataUri, OeRequestHeaders headers, Stream stream, CancellationToken cancellationToken)
        {
            OeQueryContext queryContext = CreateQueryContext(odataUri, headers.MaxPageSize, headers.NavigationNextLink, headers.MetadataLevel);

            Db.OeDataAdapter dataAdapter = _edmModel.GetDataAdapter(queryContext.EdmModel.EntityContainer);

            Object dataContext = null;

            try
            {
                dataContext = dataAdapter.CreateDataContext();
                if (queryContext.IsCountSegment)
                {
                    headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                    int    count  = dataAdapter.ExecuteScalar <int>(dataContext, queryContext);
                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(count.ToString(CultureInfo.InvariantCulture));
                    stream.Write(buffer, 0, buffer.Length);
                }
                else
                {
                    using (Db.OeAsyncEnumerator asyncEnumerator = dataAdapter.ExecuteEnumerator(dataContext, queryContext, cancellationToken))
                        await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream).ConfigureAwait(false);
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
Esempio n. 3
0
        public async Task ExecuteAsync(ODataUri odataUri, OeRequestHeaders headers, Stream stream, CancellationToken cancellationToken)
        {
            if (_modelBoundProvider != null)
            {
                _modelBoundProvider.Validate(_edmModel, odataUri);
            }

            var queryContext = new OeQueryContext(_edmModel, odataUri)
            {
                MetadataLevel = headers.MetadataLevel
            };

            if (queryContext.ODataUri.Path.LastSegment is OperationSegment)
            {
                using (IAsyncEnumerator <Object> asyncEnumerator = OeOperationHelper.ApplyBoundFunction(queryContext).GetEnumerator())
                    await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream, cancellationToken).ConfigureAwait(false);

                return;
            }

            Object dataContext = null;

            Db.OeDataAdapter dataAdapter = queryContext.EdmModel.GetDataAdapter(queryContext.EdmModel.EntityContainer);
            try
            {
                dataContext = dataAdapter.CreateDataContext();
                if (odataUri.Path.LastSegment is CountSegment)
                {
                    headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                    int    count  = dataAdapter.ExecuteScalar <int>(dataContext, queryContext);
                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(count.ToString(CultureInfo.InvariantCulture));
                    stream.Write(buffer, 0, buffer.Length);
                }
                else
                {
                    using (IAsyncEnumerator <Object> asyncEnumerator = dataAdapter.Execute(dataContext, queryContext).GetEnumerator())
                        await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream, cancellationToken).ConfigureAwait(false);
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
        public static int GetNestedCount(IEdmModel edmModel, Db.IOeDbEnumerator dbEnumerator)
        {
            Db.IOeDbEnumerator parentEnumerator = dbEnumerator.ParentEnumerator;
            ODataUri           odataUri         = OeNextPageLinkBuilder.GetCountODataUri(edmModel, parentEnumerator.EntryFactory, dbEnumerator.EntryFactory.NavigationSelectItem, parentEnumerator.Current);
            var queryContext = new OeQueryContext(edmModel, odataUri);

            IEdmEntitySet entitySet = (odataUri.Path.FirstSegment as EntitySetSegment).EntitySet;

            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(entitySet.Container);
            Object           dataContext = null;

            try
            {
                dataContext = dataAdapter.CreateDataContext();
                return(dataAdapter.ExecuteScalar <int>(dataContext, queryContext));
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }