Skip to content

Commit

Permalink
Entity equality support for non-anonymous DTOs
Browse files Browse the repository at this point in the history
MemberAssignmentBinding only for now.

Fixes #16789
  • Loading branch information
roji committed Jul 30, 2019
1 parent b9653e8 commit 7a8058d
Show file tree
Hide file tree
Showing 9 changed files with 211 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -331,37 +331,43 @@ protected override Expression VisitNew(NewExpression newExpression)
/// </summary>
protected override Expression VisitMemberInit(MemberInitExpression memberInitExpression)
{
var newExpression = (NewExpression)Visit(memberInitExpression.NewExpression);
var newExpression = VisitAndConvert(memberInitExpression.NewExpression, nameof(VisitMemberInit));
if (newExpression == null)
{
return null;
}

var newBindings = new MemberAssignment[memberInitExpression.Bindings.Count];
var newBindings = new MemberBinding[memberInitExpression.Bindings.Count];
for (var i = 0; i < newBindings.Length; i++)
{
var memberAssignment = (MemberAssignment)memberInitExpression.Bindings[i];
if (_clientEval)
newBindings[i] = VisitMemberBinding(memberInitExpression.Bindings[i]);
if (newBindings[i] == null || newBindings[i].BindingType != MemberBindingType.Assignment)
{
newBindings[i] = memberAssignment.Update(Visit(memberAssignment.Expression));
return null;
}
else
{
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);
}

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}
return memberInitExpression.Update(newExpression, newBindings);
}

newBindings[i] = memberAssignment.Update(visitedExpression);
_projectionMembers.Pop();
}
protected override MemberAssignment VisitMemberAssignment(MemberAssignment memberAssignment)
{
if (_clientEval)
{
return memberAssignment.Update(Visit(memberAssignment.Expression));
}

return memberInitExpression.Update(newExpression, newBindings);
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}

_projectionMembers.Pop();
return memberAssignment.Update(visitedExpression);
}

// TODO: Debugging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,37 +209,43 @@ protected override Expression VisitNew(NewExpression newExpression)

protected override Expression VisitMemberInit(MemberInitExpression memberInitExpression)
{
var newExpression = (NewExpression)Visit(memberInitExpression.NewExpression);
var newExpression = VisitAndConvert(memberInitExpression.NewExpression, nameof(VisitMemberInit));
if (newExpression == null)
{
return null;
}

var newBindings = new MemberAssignment[memberInitExpression.Bindings.Count];
var newBindings = new MemberBinding[memberInitExpression.Bindings.Count];
for (var i = 0; i < newBindings.Length; i++)
{
var memberAssignment = (MemberAssignment)memberInitExpression.Bindings[i];
if (_clientEval)
newBindings[i] = VisitMemberBinding(memberInitExpression.Bindings[i]);
if (newBindings[i] == null || newBindings[i].BindingType != MemberBindingType.Assignment)
{
newBindings[i] = memberAssignment.Update(Visit(memberAssignment.Expression));
return null;
}
else
{
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);
}

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}
return memberInitExpression.Update(newExpression, newBindings);
}

newBindings[i] = memberAssignment.Update(visitedExpression);
_projectionMembers.Pop();
}
protected override MemberAssignment VisitMemberAssignment(MemberAssignment memberAssignment)
{
if (_clientEval)
{
return memberAssignment.Update(Visit(memberAssignment.Expression));
}

return memberInitExpression.Update(newExpression, newBindings);
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}

_projectionMembers.Pop();
return memberAssignment.Update(visitedExpression);
}

// TODO: Debugging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,37 +232,43 @@ protected override Expression VisitNew(NewExpression newExpression)

protected override Expression VisitMemberInit(MemberInitExpression memberInitExpression)
{
var newExpression = (NewExpression)Visit(memberInitExpression.NewExpression);
var newExpression = VisitAndConvert(memberInitExpression.NewExpression, nameof(VisitMemberInit));
if (newExpression == null)
{
return null;
}

var newBindings = new MemberAssignment[memberInitExpression.Bindings.Count];
var newBindings = new MemberBinding[memberInitExpression.Bindings.Count];
for (var i = 0; i < newBindings.Length; i++)
{
var memberAssignment = (MemberAssignment)memberInitExpression.Bindings[i];
if (_clientEval)
newBindings[i] = VisitMemberBinding(memberInitExpression.Bindings[i]);
if (newBindings[i] == null || newBindings[i].BindingType != MemberBindingType.Assignment)
{
newBindings[i] = memberAssignment.Update(Visit(memberAssignment.Expression));
return null;
}
else
{
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);
}

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}
return memberInitExpression.Update(newExpression, newBindings);
}

newBindings[i] = memberAssignment.Update(visitedExpression);
_projectionMembers.Pop();
}
protected override MemberAssignment VisitMemberAssignment(MemberAssignment memberAssignment)
{
if (_clientEval)
{
return memberAssignment.Update(Visit(memberAssignment.Expression));
}

return memberInitExpression.Update(newExpression, newBindings);
var projectionMember = _projectionMembers.Peek().Append(memberAssignment.Member);
_projectionMembers.Push(projectionMember);

var visitedExpression = Visit(memberAssignment.Expression);
if (visitedExpression == null)
{
return null;
}

_projectionMembers.Pop();
return memberAssignment.Update(visitedExpression);
}

// TODO: Debugging
Expand Down
Loading

0 comments on commit 7a8058d

Please sign in to comment.