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