dotnet / dotnet/efcore

Cosmos: Anonymous and dto projections filter undefined implicitly when projecting a single property

Open
#38,298 10 comments 1 reaction 2 assignees Claimed by @AndriySvyryd View on GitHub
area-cosmos customer-reported
Dominant language
C#
Stars
14.8k
Forks
3.4k
PR merge metrics
PR metrics pending

Description

### Bug description

The cosmos provider translates anonymous or dto projections with a single property as `SELECT VALUE prop` causing implicit undefined filtering behavior.
Anonymous or dto projections with multiple properties get translated as `SELECT prop1, prop2`, throwing an 'nullable object must have a value' exception in the shaper for undefined results.
Also see: https://github.com/dotnet/efcore/issues/34067#issuecomment-4486025845

### Your code

```csharp
using Microsoft.EntityFrameworkCore;

var options = new DbContextOptionsBuilder()
.EnableSensitiveDataLogging()
.UseCosmos("AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", "test")
.LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information)
.Options;

using var context = new MyDbContext(options);
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();

context.Entities.Add(new Entity());
await context.SaveChangesAsync();

var noResults = await context.Entities.Select(x => new { x.Associate!.NestedAssociate!.Id }).ToListAsync();
var noResultsDto = await context.Entities.Select(x => new Dto { Id = x.Associate!.NestedAssociate!.Id }).ToListAsync();
var exceptionInShaper = await context.Entities.Select(x => new { x.Associate!.NestedAssociate!.Id, x.Associate.NestedAssociate.String }).ToListAsync();
var exceptionInShaperDto = await context.Entities.Select(x => new Dto { Id = x.Associate!.NestedAssociate!.Id, String = x.Associate.NestedAssociate.String }).ToListAsync();

public class MyDbContext(DbContextOptions options) : DbContext(options)
{
public DbSet Entities { get; set; } = null!;
}

public class Entity
{
public Guid Id { get; set; }
public AssociateEntity? Associate { get; set; }
}

public class AssociateEntity
{
public Guid Id { get; set; }

public NestedAssociateEntity? NestedAssociate { get; set; } = null!;
}

public class NestedAssociateEntity
{
public Guid Id { get; set; }

public string? String { get; set; }
}

public class Dto
{
public Guid Id { get; set; }

public string? String { get; set; }

}
```

### Stack traces

```text
An exception occurred while iterating over the results of a query for context type 'MyDbContext'.
System.InvalidOperationException: Nullable object must have a value.
at lambda_method153(Closure, QueryContext, JToken)
at Microsoft.EntityFrameworkCore.Cosmos.Query.Internal.CosmosShapedQueryCompilingExpressionVisitor.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
```

### Verbose output

```text
info: 19-May-26 13:33:18.651 CosmosEventId.ExecutingSqlQuery[30100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing SQL query for container 'MyDbContext' in partition 'None' [Parameters=[]]
SELECT VALUE c["Associate"]["NestedAssociate"]["Id"]
FROM root c
info: 19-May-26 13:33:18.798 CosmosEventId.ExecutedReadNext[30102] (Microsoft.EntityFrameworkCore.Database.Command)
Executed ReadNext (129.3505 ms, 2.89 RU) ActivityId='bf5132a2-f8d4-4aa1-9941-5adbaf9e97e7', Container='MyDbContext', Partition='None', Parameters=[]
SELECT VALUE c["Associate"]["NestedAssociate"]["Id"]
FROM root c
info: 19-May-26 13:33:18.808 CosmosEventId.ExecutingSqlQuery[30100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing SQL query for container 'MyDbContext' in partition 'None' [Parameters=[]]
SELECT VALUE c["Associate"]["NestedAssociate"]["Id"]
FROM root c
info: 19-May-26 13:33:18.812 CosmosEventId.ExecutedReadNext[30102] (Microsoft.EntityFrameworkCore.Database.Command)
Executed ReadNext (3.345 ms, 2.89 RU) ActivityId='2a8bfca9-b3c3-4c89-8077-76261e3ff1af', Container='MyDbContext', Partition='None', Parameters=[]
SELECT VALUE c["Associate"]["NestedAssociate"]["Id"]
FROM root c
info: 19-May-26 13:33:23.621 CosmosEventId.ExecutingSqlQuery[30100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing SQL query for container 'MyDbContext' in partition 'None' [Parameters=[]]
SELECT c["Associate"]["NestedAssociate"]["Id"], c["Associate"]["NestedAssociate"]["String"]
FROM root c
info: 19-May-26 13:33:23.650 CosmosEventId.ExecutedReadNext[30102] (Microsoft.EntityFrameworkCore.Database.Command)
Executed ReadNext (29.1839 ms, 2.27 RU) ActivityId='8d688ec0-69b7-4827-9263-49bda1304f3d', Container='MyDbContext', Partition='None', Parameters=[]
SELECT c["Associate"]["NestedAssociate"]["Id"], c["Associate"]["NestedAssociate"]["String"]
FROM root c
```

### EF Core version

10.0.8

### Database provider

Microsoft.EntityFrameworkCore.Cosmos

### Target framework

.NET 10

### Operating system

W11

### IDE

VS2026

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.