protected override Expression VisitBinary(BinaryExpression node) { var newLeft = Visit(node.Left); var newRight = Visit(node.Right); if (newLeft == node.Left && newRight == node.Right) { return(node); } var leftNavigationJoin = _navigationJoins .SelectMany(nj => nj.Iterate()) .FirstOrDefault(nj => ReferenceEquals(nj.QuerySourceReferenceExpression, newLeft)); var rightNavigationJoin = _navigationJoins .SelectMany(nj => nj.Iterate()) .FirstOrDefault(nj => ReferenceEquals(nj.QuerySourceReferenceExpression, newRight)); var leftJoin = leftNavigationJoin?.JoinClause ?? leftNavigationJoin?.GroupJoinClause?.JoinClause; var rightJoin = rightNavigationJoin?.JoinClause ?? rightNavigationJoin?.GroupJoinClause?.JoinClause; if (leftNavigationJoin != null && rightNavigationJoin != null) { if (leftNavigationJoin.DependentToPrincipal && rightNavigationJoin.DependentToPrincipal) { newLeft = leftJoin?.OuterKeySelector; newRight = rightJoin?.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, leftNavigationJoin); NavigationJoin.RemoveNavigationJoin(_navigationJoins, rightNavigationJoin); } } else { if (leftNavigationJoin != null) { var constantExpression = newRight as ConstantExpression; if (constantExpression != null && constantExpression.Value == null) { if (leftNavigationJoin.DependentToPrincipal) { newLeft = leftJoin?.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, leftNavigationJoin); if (newLeft != null && IsCompositeKey(newLeft.Type)) { newRight = CreateNullCompositeKey(newLeft); } } } else { newLeft = leftJoin?.InnerKeySelector; } } if (rightNavigationJoin != null) { var constantExpression = newLeft as ConstantExpression; if (constantExpression != null && constantExpression.Value == null) { if (rightNavigationJoin.DependentToPrincipal) { newRight = rightJoin?.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, rightNavigationJoin); if (newRight != null && IsCompositeKey(newRight.Type)) { newLeft = CreateNullCompositeKey(newRight); } } } else { newRight = rightJoin?.InnerKeySelector; } } } if (node.NodeType != ExpressionType.ArrayIndex && newLeft != null && newRight != null && newLeft.Type != newRight.Type) { if (newLeft.Type.IsNullableType() && !newRight.Type.IsNullableType()) { newRight = Expression.Convert(newRight, newLeft.Type); } else if (!newLeft.Type.IsNullableType() && newRight.Type.IsNullableType()) { newLeft = Expression.Convert(newLeft, newRight.Type); } } return(Expression.MakeBinary(node.NodeType, newLeft, newRight)); }
protected override Expression VisitBinary(BinaryExpression binaryExpression) { var newLeft = Visit(binaryExpression.Left); var newRight = Visit(binaryExpression.Right); var leftNavigationJoin = _navigationJoins .SelectMany(nj => nj.Iterate()) .FirstOrDefault(nj => ReferenceEquals(nj.QuerySourceReferenceExpression, newLeft)); var rightNavigationJoin = _navigationJoins .SelectMany(nj => nj.Iterate()) .FirstOrDefault(nj => ReferenceEquals(nj.QuerySourceReferenceExpression, newRight)); if (leftNavigationJoin != null && rightNavigationJoin != null) { newLeft = leftNavigationJoin.JoinClause.OuterKeySelector; newRight = rightNavigationJoin.JoinClause.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, leftNavigationJoin); NavigationJoin.RemoveNavigationJoin(_navigationJoins, rightNavigationJoin); } else { if (leftNavigationJoin != null) { var constantExpression = newRight as ConstantExpression; if (constantExpression != null && constantExpression.Value == null) { newLeft = leftNavigationJoin.JoinClause.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, leftNavigationJoin); if (IsCompositeKey(newLeft.Type)) { newRight = CreateNullCompositeKey(newLeft); } } else { newLeft = leftNavigationJoin.JoinClause.InnerKeySelector; } } if (rightNavigationJoin != null) { var constantExpression = newLeft as ConstantExpression; if (constantExpression != null && constantExpression.Value == null) { newRight = rightNavigationJoin.JoinClause.OuterKeySelector; NavigationJoin.RemoveNavigationJoin(_navigationJoins, rightNavigationJoin); if (IsCompositeKey(newRight.Type)) { newLeft = CreateNullCompositeKey(newRight); } } else { newRight = rightNavigationJoin.JoinClause.InnerKeySelector; } } } return(Expression.MakeBinary( binaryExpression.NodeType, newLeft, newRight, binaryExpression.IsLiftedToNull, binaryExpression.Method)); }