Skip to content

Commit fb8cf0f

Browse files
committed
Add tests for split query and weak entities
Resolves #21333 Owned ones were already added earlier
1 parent 806b45e commit fb8cf0f

File tree

4 files changed

+514
-8
lines changed

4 files changed

+514
-8
lines changed

src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,12 +1330,27 @@ public Expression ApplyCollectionJoin(
13301330

13311331
if (splitQuery)
13321332
{
1333-
var parentIdentifier = GetIdentifierAccessor(_identifier).Item1;
1333+
var identifierFromParent = _identifier;
1334+
if (innerSelectExpression.Tables.LastOrDefault(e => e is InnerJoinExpression) is InnerJoinExpression collectionInnerJoinExpression
1335+
&& collectionInnerJoinExpression.Table is SelectExpression collectionInnerSelectExpression)
1336+
{
1337+
// This computes true parent identifier count for correlation.
1338+
// The last inner joined table in innerSelectExpression brings collection data.
1339+
// Further tables load additional data on the collection (hence uses outer pattern)
1340+
// So identifier not coming from there (which would be at the start only) are for correlation with parent.
1341+
// Parent can have additional identifier if a owned reference was expanded.
1342+
var actualParentIdentifierCount = innerSelectExpression._identifier
1343+
.TakeWhile(e => !ReferenceEquals(e.Column.Table, collectionInnerSelectExpression))
1344+
.Count();
1345+
identifierFromParent = _identifier.Take(actualParentIdentifierCount).ToList();
1346+
}
1347+
1348+
var parentIdentifier = GetIdentifierAccessor(identifierFromParent).Item1;
13341349
innerSelectExpression.ApplyProjection();
13351350

1336-
for (var i = 0; i < _identifier.Count; i++)
1351+
for (var i = 0; i < identifierFromParent.Count; i++)
13371352
{
1338-
AppendOrdering(new OrderingExpression(_identifier[i].Column, ascending: true));
1353+
AppendOrdering(new OrderingExpression(identifierFromParent[i].Column, ascending: true));
13391354
}
13401355

13411356
// Copy over ordering from previous collections
@@ -1384,14 +1399,15 @@ public Expression ApplyCollectionJoin(
13841399
}
13851400

13861401
var (childIdentifier, childIdentifierValueComparers) = innerSelectExpression
1387-
.GetIdentifierAccessor(innerSelectExpression._identifier.Take(_identifier.Count));
1402+
.GetIdentifierAccessor(innerSelectExpression._identifier.Take(identifierFromParent.Count));
13881403

13891404
var identifierIndex = 0;
13901405
var orderingIndex = 0;
13911406
for (var i = 0; i < Orderings.Count; i++)
13921407
{
13931408
var outerOrdering = Orderings[i];
1394-
if (outerOrdering.Expression.Equals(_identifier[identifierIndex].Column))
1409+
if (identifierIndex < identifierFromParent.Count
1410+
&& outerOrdering.Expression.Equals(identifierFromParent[identifierIndex].Column))
13951411
{
13961412
innerSelectExpression.AppendOrdering(new OrderingExpression(
13971413
innerSelectExpression._identifier[identifierIndex].Column, ascending: true));
@@ -2520,7 +2536,7 @@ private SelectExpression Prune(IReadOnlyCollection<string> referencedColumns = n
25202536
&& !IsDistinct)
25212537
{
25222538
var indexesToRemove = new List<int>();
2523-
for (var i = _projection.Count - 1; i >=0; i--)
2539+
for (var i = _projection.Count - 1; i >= 0; i--)
25242540
{
25252541
if (!referencedColumns.Contains(_projection[i].Alias))
25262542
{

0 commit comments

Comments
 (0)