Esempio n. 1
0
        private static async Task <TResult> ExecuteSingletonAsyncQuery <TResult>(
            QueryContext queryContext,
            Func <QueryContext, IAsyncEnumerable <TResult> > compiledQuery,
            IInterceptingLogger <LoggerCategory.Query> logger,
            Type contextType)
        {
            try
            {
                var asyncEnumerable = compiledQuery(queryContext);

                using (var asyncEnumerator = asyncEnumerable.GetEnumerator())
                {
                    await asyncEnumerator.MoveNext(queryContext.CancellationToken);

                    return(asyncEnumerator.Current);
                }
            }
            catch (Exception exception)
            {
                logger
                .LogError(
                    CoreEventId.DatabaseError,
                    () => new DatabaseErrorLogState(contextType),
                    exception,
                    e => CoreStrings.LogExceptionDuringQueryIteration(Environment.NewLine, e));

                throw;
            }
        }
Esempio n. 2
0
        private static Func <QueryContext, TResult> CompileQueryCore <TResult>(
            Expression query, INodeTypeProvider nodeTypeProvider, IDatabase database, IInterceptingLogger <LoggerCategory.Query> logger, Type contextType)
        {
            var queryModel
                = CreateQueryParser(nodeTypeProvider)
                  .GetParsedQuery(query);

            var resultItemType
                = (queryModel.GetOutputDataInfo()
                   as StreamedSequenceInfo)?.ResultItemType
                  ?? typeof(TResult);

            if (resultItemType == typeof(TResult))
            {
                var compiledQuery = database.CompileQuery <TResult>(queryModel);

                return(qc =>
                {
                    try
                    {
                        return compiledQuery(qc).First();
                    }
                    catch (Exception exception)
                    {
                        logger
                        .LogError(
                            CoreEventId.DatabaseError,
                            () => new DatabaseErrorLogState(contextType),
                            exception,
                            e => CoreStrings.LogExceptionDuringQueryIteration(Environment.NewLine, e));

                        throw;
                    }
                });
            }

            try
            {
                return((Func <QueryContext, TResult>)CompileQueryMethod
                       .MakeGenericMethod(resultItemType)
                       .Invoke(database, new object[] { queryModel }));
            }
            catch (TargetInvocationException e)
            {
                ExceptionDispatchInfo.Capture(e.InnerException).Throw();

                throw;
            }
        }