In various Join/SelectMany scenarios, a JOIN subquery may need to project out a JSON object:
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual Task Column_collection_SelectMany_with_projection_to_anonymous_type(bool async)
=> AssertQuery(
async,
ss => ss.Set<PrimitiveCollectionsEntity>().SelectMany(c => c.Ints.Select(i => new { Original = i, Incremented = i + 1 })));
Desired NoSQL translation:
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.
In various Join/SelectMany scenarios, a JOIN subquery may need to project out a JSON object:
Desired NoSQL translation:
Hoewver, the
ain 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.