private static Func <QueryContext, TResult> CompileQueryCore <TResult>(
            Expression query,
            IModel model,
            IQueryModelGenerator queryModelGenerator,
            IDatabase database,
            IDiagnosticsLogger <DbLoggerCategory.Query> logger,
            Type contextType)
        {
            query = ExpandNavigations(query, model);

            var queryModel = queryModelGenerator.ParseQuery(query);

            // this is temporary, until relinq is removed
            var tirev = new TransparentIdentifierRemovingVisitor();

            queryModel.TransformExpressions(tirev.Visit);

            var atasev = new AnonymousObjectAccessSimplifyingVisitor();

            queryModel.TransformExpressions(atasev.Visit);

            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.QueryIterationFailed(contextType, exception);

                        throw;
                    }
                });
            }

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

                throw;
            }
        }
        private static Func <QueryContext, TResult> CompileAsyncQueryCore <TResult>(
            Expression query,
            IModel model,
            IQueryModelGenerator queryModelGenerator,
            IDatabase database)
        {
            query = ExpandNavigations(query, model);

            var queryModel = queryModelGenerator.ParseQuery(query);

            // this is temporary, until relinq is removed
            var tirev = new TransparentIdentifierRemovingVisitor();

            queryModel.TransformExpressions(tirev.Visit);

            var atasev = new AnonymousObjectAccessSimplifyingVisitor();

            queryModel.TransformExpressions(atasev.Visit);

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

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

                throw;
            }
        }