Skip to content

[10 Regression] ExecuteUpdate no longer works within compiled queries #36741

Description

@Atulin

Bug description

After an update to .NET 10.0-rc1, a compiled query that worked no problem in 9.0 stopped working. That same query, when not compiled but invoked directly, works without a hitch.

Your code

private static async ValueTask<ReturnType> HandleAsync(
	Command _,
	ApplicationDbContext context,
	IUserService userService,
	CancellationToken cancellationToken
)
{
	if (userService.User?.GetNumericId() is not {} uid) return TypedResults.NoContent();
	var rows = await CompiledQuery(context, uid, cancellationToken);
	return TypedResults.Ok(rows);
}
private static readonly Func<ApplicationDbContext, long, CancellationToken, Task<int>> CompiledQuery =
	EF.CompileAsyncQuery(static (ApplicationDbContext context, long uid, CancellationToken _)
		=> context.Users
			.TagWith(nameof(UpdateLastActive))
			.Where(u => u.Id == uid)
			.ExecuteUpdate(setters => setters.SetProperty(u => u.LastActive, DateTimeOffset.UtcNow)));

When the compiled query is replaced with a direct query call, like so, everything works just fine:

private static async ValueTask<ReturnType> HandleAsync(
	Command _,
	ApplicationDbContext context,
	IUserService userService,
	CancellationToken cancellationToken
)
{
	if (userService.User?.GetNumericId() is not {} uid) return TypedResults.NoContent();
	// var rows = await CompiledQuery(context, uid, cancellationToken);
	var rows = await context.Users
		.TagWith(nameof(UpdateLastActive))
		.Where(u => u.Id == uid)
		.ExecuteUpdateAsync(setters => setters.SetProperty(u => u.LastActive, DateTimeOffset.UtcNow), cancellationToken);
	return TypedResults.Ok(rows);
}

Stack traces

[01:12:48 INF] Request starting HTTP/2 HEAD https://localhost:5001/api/useractivity - null null
[01:12:48 INF] Executing endpoint 'HTTP: HEAD api/useractivity'
[01:12:48 INF] Executed endpoint 'HTTP: HEAD api/useractivity'
[01:12:48 ERR] An unhandled exception has occurred while executing the request.
System.InvalidOperationException: The LINQ expression 'DbSet<OgmaUser>()
    .Where(o0 => o0.Id == @uid)
    .ExecuteUpdate(setters => setters.SetProperty<DateTimeOffset>(
        propertyExpression: u => u.LastActive, 
        valueExpression: DateTimeOffset.UtcNow))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.Translate(Expression expression)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutorExpression[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CreateCompiledAsyncQuery[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledAsyncTaskQuery`2.CreateCompiledQuery(IQueryCompiler queryCompiler, Expression expression)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.<>c.<EnsureExecutor>b__7_0(CompiledQueryBase`2 t, TContext c, LambdaExpression q)
   at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam1,TParam2,TParam3,TValue](TValue& target, TParam1 param1, TParam2 param2, TParam3 param3, Func`4 valueFactory)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.EnsureExecutor(TContext context)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryBase`2.ExecuteCore(TContext context, CancellationToken cancellationToken, Object[] parameters)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledAsyncTaskQuery`2.ExecuteAsync[TParam1](TContext context, TParam1 param1, CancellationToken cancellationToken)
   at Ogma3.Api.V1.UserActivity.UpdateLastActive.HandleAsync(Command _, ApplicationDbContext context, IUserService userService, CancellationToken cancellationToken) in F:\VS Projects\Ogma3\Ogma3\Api\V1\UserActivity\UpdateLastActive.cs:line 35
   at Ogma3.Api.V1.UserActivity.UpdateLastActive.HandleBehavior.HandleAsync(Command request, CancellationToken cancellationToken) in F:\VS Projects\Ogma3\Ogma3\obj\Generated\Immediate.Handlers.Generators\Immediate.Handlers.Generators.ImmediateHandlersGenerator\IH.Ogma3.Api.V1.UserActivity.UpdateLastActive.g.cs:line 54
   at Ogma3.Api.V1.UserActivity.UpdateLastActive.Handler.HandleAsync(Command request, CancellationToken cancellationToken) in F:\VS Projects\Ogma3\Ogma3\obj\Generated\Immediate.Handlers.Generators\Immediate.Handlers.Generators.ImmediateHandlersGenerator\IH.Ogma3.Api.V1.UserActivity.UpdateLastActive.g.cs:line 28
   at Microsoft.AspNetCore.Builder.Ogma3RoutesBuilder.<>c.<<MapOgma3_Api_V1_UserActivity_UpdateLastActiveEndpoint>b__76_0>d.MoveNext() in F:\VS Projects\Ogma3\Ogma3\obj\Generated\Immediate.Apis.Generators\Immediate.Apis.Generators.ImmediateApisGenerator\RouteBuilder.Ogma3_Api_V1_UserActivity_UpdateLastActive.g.cs:line 24
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteTaskResult[T](Task`1 task, HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|7_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Ogma3.Infrastructure.Middleware.UserBanMiddleware.InvokeAsync(HttpContext httpContext, RequestDelegate next) in F:\VS Projects\Ogma3\Ogma3\Infrastructure\Middleware\UserBanMiddleware.cs:line 29
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

Verbose output


EF Core version

10.0.0-rc.1.25451.107

Database provider

Npgsql.EntityFrameworkCore.PostgreSQL 10.0.0-rc.1

Target framework

10.0.100-rc.1.25451.107

Operating system

Windows 11

IDE

JetBrains Rider 2025.2.1

Metadata

Metadata

Assignees

Type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions