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