diff --git a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs index 96557f400f5..52265dee39d 100644 --- a/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs +++ b/src/HotChocolate/Data/src/Data/Projections/Expressions/Handlers/QueryableProjectionFieldHandler.cs @@ -69,8 +69,6 @@ public override bool TryHandleLeave( return false; } - var memberInit = queryableScope.CreateMemberInit(); - if (!context.TryGetQueryableScope(out var parentScope)) { throw ThrowHelper.ProjectionVisitor_InvalidState_NoParentScope(); @@ -88,6 +86,21 @@ public override bool TryHandleLeave( return true; } + // If the nested scope has no projectable members we keep the original value. + // This happens for members like JsonDocument where selected subfields are read-only. + if (!queryableScope.HasAbstractTypes() && queryableScope.Level.Peek().Count == 0) + { + parentScope.Level + .Peek() + .Enqueue(Expression.Bind(field.Member, nestedProperty)); + + action = SelectionVisitor.Continue; + + return true; + } + + var memberInit = queryableScope.CreateMemberInit(); + if (context.InMemory) { parentScope.Level diff --git a/src/HotChocolate/Data/test/Data.Tests/Issue5893Tests.cs b/src/HotChocolate/Data/test/Data.Tests/Issue5893Tests.cs new file mode 100644 index 00000000000..0e2ebe82249 --- /dev/null +++ b/src/HotChocolate/Data/test/Data.Tests/Issue5893Tests.cs @@ -0,0 +1,55 @@ +using System.Text.Json; +using HotChocolate.Execution; +using Microsoft.Extensions.DependencyInjection; + +namespace HotChocolate.Data; + +public class Issue5893Tests +{ + [Fact] + public async Task UseProjection_With_JsonDocument_Should_Not_Error() + { + var executor = await new ServiceCollection() + .AddGraphQLServer() + .AddProjections() + .AddQueryType() + .BuildRequestExecutorAsync(); + + var result = await executor.ExecuteAsync( + """ + { + tests { + codigo + data { + rootElement + } + } + } + """); + + var operationResult = result.ExpectOperationResult(); + Assert.Empty(operationResult.Errors ?? []); + } + + public sealed class Issue5893Query + { + [UseProjection] + public IQueryable GetTests() + => new[] + { + new Issue5893Model + { + Codigo = "a", + Data = JsonDocument.Parse("""{"a":1}""") + } + } + .AsQueryable(); + } + + public sealed class Issue5893Model + { + public string Codigo { get; set; } = string.Empty; + + public JsonDocument? Data { get; set; } + } +}