Skip to content

Commit b3daf86

Browse files
committed
Entity reference joining changed
Using left join now also takes into account ApplyProvider.ApplyType if it is possible Additionally, - new formatting applied - complicated branching simplified
1 parent dffdda7 commit b3daf86

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2021 Xtensive LLC.
1+
// Copyright (C) 2009-2024 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Alexis Kochetov
@@ -1662,38 +1662,30 @@ private void EnsureEntityReferenceIsJoined(EntityFieldExpression entityFieldExpr
16621662
{
16631663
if (entityFieldExpression.Entity!=null)
16641664
return;
1665-
TypeInfo typeInfo = entityFieldExpression.PersistentType;
1666-
IndexInfo joinedIndex = typeInfo.Indexes.PrimaryIndex;
1665+
var typeInfo = entityFieldExpression.PersistentType;
1666+
var joinedIndex = typeInfo.Indexes.PrimaryIndex;
16671667
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()
16701670
.Select((leftIndex, rightIndex) => new Pair<int>(leftIndex, rightIndex))
16711671
.ToArray();
1672-
ItemProjectorExpression originalItemProjector = entityFieldExpression.OuterParameter==null
1672+
var originalItemProjector = entityFieldExpression.OuterParameter==null
16731673
? context.Bindings[state.Parameters[0]].ItemProjector
16741674
: context.Bindings[entityFieldExpression.OuterParameter].ItemProjector;
1675-
int offset = originalItemProjector.DataSource.Header.Length;
1675+
16761676
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;
16931684
}
1685+
16941686
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);
16971689
originalItemProjector.DataSource = newDataSource;
16981690
entityFieldExpression.RegisterEntityExpression(offset);
16991691
context.RebindApplyParameter(oldDataSource, newDataSource);

0 commit comments

Comments
 (0)