Skip to content

Commit

Permalink
Query: Materialize outer entity in groupjoin to examine changes in ou…
Browse files Browse the repository at this point in the history
…ter element
  • Loading branch information
smitpatel committed Aug 23, 2016
1 parent bd8f4e4 commit 37531d2
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 31 deletions.
Expand Up @@ -272,8 +272,6 @@ var previousGroupJoinInclude
var outerGroupJoinIncludeContext = outerGroupJoinInclude?.Initialize(queryContext);
var innerGroupJoinIncludeContext = innerGroupJoinInclude?.Initialize(queryContext);

var hasOuters = (innerShaper as EntityShaper)?.ValueBufferOffset > 0;

try
{
using (var sourceEnumerator = source.GetEnumerator())
Expand Down Expand Up @@ -319,18 +317,15 @@ var outer
break;
}

if (hasOuters)
{
nextOuter = outerShaper.Shape(queryContext, sourceEnumerator.Current);

if (!Equals(outer, nextOuter))
{
break;
}
nextOuter = outerShaper.Shape(queryContext, sourceEnumerator.Current);

nextOuter = default(TOuter);
if (!Equals(outer, nextOuter))
{
break;
}

nextOuter = default(TOuter);

inner = innerShaper.Shape(queryContext, sourceEnumerator.Current);

if (inner == null)
Expand Down
Expand Up @@ -4650,6 +4650,20 @@ orderby c.City
select o);
}

[ConditionalFact]
public virtual void GroupJoin_with_different_outer_elements_with_same_key()
{
AssertQuery<Order, Customer>((os, cs) =>
os.GroupJoin(cs,
o => o.CustomerID,
c => c.CustomerID,
(o, cg) => new
{
o.OrderID,
Name = cg.Select(c => c.ContactName).FirstOrDefault()
}));
}

[ConditionalFact]
public virtual void SelectMany_Joined()
{
Expand Down
Expand Up @@ -324,9 +324,15 @@ public virtual IReadOnlyList<IReadOnlyList<INavigation>> GetTrackableIncludes([N
.Create(queryModelVisitor)
.FindQuerySourcesRequiringMaterialization(queryModel);

foreach (var groupJoinClause in queryModel.BodyClauses.OfType<GroupJoinClause>())
var groupJoinClauses = queryModel.BodyClauses.OfType<GroupJoinClause>().ToList();
if (groupJoinClauses.Any())
{
_querySourcesRequiringMaterialization.Add(groupJoinClause.JoinClause);
_querySourcesRequiringMaterialization.Add(queryModel.MainFromClause);
foreach (var groupJoinClause in groupJoinClauses)
{
_querySourcesRequiringMaterialization.Add(groupJoinClause.JoinClause);
}

}
}

Expand Down

0 comments on commit 37531d2

Please sign in to comment.