Cosmos: Allow subqueries with anonymous type projections
- 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
Assessment
This issue has not been assessed yet.