Skip to content

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

@Atulin

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

No fields configured for Bug.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions