@@ -1330,12 +1330,27 @@ public Expression ApplyCollectionJoin(
1330
1330
1331
1331
if ( splitQuery )
1332
1332
{
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 ;
1334
1349
innerSelectExpression . ApplyProjection ( ) ;
1335
1350
1336
- for ( var i = 0 ; i < _identifier . Count ; i ++ )
1351
+ for ( var i = 0 ; i < identifierFromParent . Count ; i ++ )
1337
1352
{
1338
- AppendOrdering ( new OrderingExpression ( _identifier [ i ] . Column , ascending : true ) ) ;
1353
+ AppendOrdering ( new OrderingExpression ( identifierFromParent [ i ] . Column , ascending : true ) ) ;
1339
1354
}
1340
1355
1341
1356
// Copy over ordering from previous collections
@@ -1384,14 +1399,15 @@ public Expression ApplyCollectionJoin(
1384
1399
}
1385
1400
1386
1401
var ( childIdentifier , childIdentifierValueComparers ) = innerSelectExpression
1387
- . GetIdentifierAccessor ( innerSelectExpression . _identifier . Take ( _identifier . Count ) ) ;
1402
+ . GetIdentifierAccessor ( innerSelectExpression . _identifier . Take ( identifierFromParent . Count ) ) ;
1388
1403
1389
1404
var identifierIndex = 0 ;
1390
1405
var orderingIndex = 0 ;
1391
1406
for ( var i = 0 ; i < Orderings . Count ; i ++ )
1392
1407
{
1393
1408
var outerOrdering = Orderings [ i ] ;
1394
- if ( outerOrdering . Expression . Equals ( _identifier [ identifierIndex ] . Column ) )
1409
+ if ( identifierIndex < identifierFromParent . Count
1410
+ && outerOrdering . Expression . Equals ( identifierFromParent [ identifierIndex ] . Column ) )
1395
1411
{
1396
1412
innerSelectExpression . AppendOrdering ( new OrderingExpression (
1397
1413
innerSelectExpression . _identifier [ identifierIndex ] . Column , ascending : true ) ) ;
@@ -2520,7 +2536,7 @@ private SelectExpression Prune(IReadOnlyCollection<string> referencedColumns = n
2520
2536
&& ! IsDistinct )
2521
2537
{
2522
2538
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 -- )
2524
2540
{
2525
2541
if ( ! referencedColumns . Contains ( _projection [ i ] . Alias ) )
2526
2542
{
0 commit comments