|
1 | | -// Copyright (C) 2009-2021 Xtensive LLC. |
| 1 | +// Copyright (C) 2009-2024 Xtensive LLC. |
2 | 2 | // This code is distributed under MIT license terms. |
3 | 3 | // See the License.txt file in the project root for more information. |
4 | 4 | // Created by: Alexis Kochetov |
@@ -1662,38 +1662,30 @@ private void EnsureEntityReferenceIsJoined(EntityFieldExpression entityFieldExpr |
1662 | 1662 | { |
1663 | 1663 | if (entityFieldExpression.Entity!=null) |
1664 | 1664 | return; |
1665 | | - TypeInfo typeInfo = entityFieldExpression.PersistentType; |
1666 | | - IndexInfo joinedIndex = typeInfo.Indexes.PrimaryIndex; |
| 1665 | + var typeInfo = entityFieldExpression.PersistentType; |
| 1666 | + var joinedIndex = typeInfo.Indexes.PrimaryIndex; |
1667 | 1667 | var joinedRs = joinedIndex.GetQuery().Alias(context.GetNextAlias()); |
1668 | | - Segment<int> keySegment = entityFieldExpression.Mapping; |
1669 | | - Pair<int>[] keyPairs = keySegment.GetItems() |
| 1668 | + var keySegment = entityFieldExpression.Mapping; |
| 1669 | + var keyPairs = keySegment.GetItems() |
1670 | 1670 | .Select((leftIndex, rightIndex) => new Pair<int>(leftIndex, rightIndex)) |
1671 | 1671 | .ToArray(); |
1672 | | - ItemProjectorExpression originalItemProjector = entityFieldExpression.OuterParameter==null |
| 1672 | + var originalItemProjector = entityFieldExpression.OuterParameter==null |
1673 | 1673 | ? context.Bindings[state.Parameters[0]].ItemProjector |
1674 | 1674 | : context.Bindings[entityFieldExpression.OuterParameter].ItemProjector; |
1675 | | - int offset = originalItemProjector.DataSource.Header.Length; |
| 1675 | + |
1676 | 1676 | var oldDataSource = originalItemProjector.DataSource; |
1677 | | - bool shouldUseLeftJoin = false; |
1678 | | - var filterProvider = oldDataSource as FilterProvider; |
1679 | | - if (filterProvider!=null) { |
1680 | | - var applyProvider = filterProvider.Source as ApplyProvider; |
1681 | | - if (applyProvider!=null) |
1682 | | - shouldUseLeftJoin = applyProvider.ApplyType==JoinType.LeftOuter; |
1683 | | - else { |
1684 | | - var joinProvider = filterProvider.Source as JoinProvider; |
1685 | | - if (joinProvider!=null) |
1686 | | - shouldUseLeftJoin = joinProvider.JoinType==JoinType.LeftOuter; |
1687 | | - } |
1688 | | - } |
1689 | | - else { |
1690 | | - var joinProvider = oldDataSource as JoinProvider; |
1691 | | - if (joinProvider!=null) |
1692 | | - shouldUseLeftJoin = joinProvider.JoinType==JoinType.LeftOuter; |
| 1677 | + var offset = oldDataSource.Header.Length; |
| 1678 | + var shouldUseLeftJoin = false; |
| 1679 | + |
| 1680 | + var sourceToCheck = (oldDataSource is FilterProvider filterProvider) ? filterProvider.Source : oldDataSource; |
| 1681 | + if ((sourceToCheck is ApplyProvider applyProvider && applyProvider.ApplyType == JoinType.LeftOuter) || |
| 1682 | + (sourceToCheck is JoinProvider joinProvider && joinProvider.JoinType == JoinType.LeftOuter)) { |
| 1683 | + shouldUseLeftJoin = true; |
1693 | 1684 | } |
| 1685 | + |
1694 | 1686 | var newDataSource = entityFieldExpression.IsNullable || shouldUseLeftJoin |
1695 | | - ? originalItemProjector.DataSource.LeftJoin(joinedRs, keyPairs) |
1696 | | - : originalItemProjector.DataSource.Join(joinedRs, keyPairs); |
| 1687 | + ? oldDataSource.LeftJoin(joinedRs, keyPairs) |
| 1688 | + : oldDataSource.Join(joinedRs, keyPairs); |
1697 | 1689 | originalItemProjector.DataSource = newDataSource; |
1698 | 1690 | entityFieldExpression.RegisterEntityExpression(offset); |
1699 | 1691 | context.RebindApplyParameter(oldDataSource, newDataSource); |
|
0 commit comments