dotnet / dotnet/efcore

Cosmos: Allow subqueries with anonymous type projections

Open
#34,004 0 comments 0 reactions 0 assignees View on GitHub
area-cosmos area-query
Dominant language
C#
Stars
14.8k
Forks
3.4k
PR merge metrics
PR metrics pending

Description

In various Join/SelectMany scenarios, a JOIN subquery may need to project out a JSON object:

```c#
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Column_collection_SelectMany_with_projection_to_anonymous_type(bool async)
=> AssertQuery(
async,
ss => ss.Set().SelectMany(c => c.Ints.Select(i => new { Original = i, Incremented = i + 1 })));
```

Desired NoSQL translation:

```sql
SELECT a["Original"], a["Incremented"]
FROM root c
JOIN (
SELECT VALUE
{
"Original" : i,
"Incremented" : (i + 1)
}
FROM i IN c["Ints"]) a
WHERE (c["Discriminator"] = "PrimitiveCollectionsEntity")
```

Hoewver, the `a` in the SELECT clause above is a reference to a projected ad-hoc JSON object (with Original/Incremented) which doesn't correspond to a type in the model; we currently have no way to represent that, since ObjectReferenceExpression requires an IEntityType. Changing that requires shaper-side changes (see comment in ObjectReferenceExpression); if we can remove that requirement, we can possibly also merge ScalarReferenceExpression and ObjectReferenceExpression to a single SourceReferenceExpression.

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.