/// Adds a LEFT/RIGHT JOIN part of the SQL query as FROM parts, while replacing corresponding FROM parts. /// /// If a subquery parts aggregator is open, redirects the call to it instead. public void AddOuterJoinPart(string outerMember, string innerMember) { if (_visitingSubQueryExpression) { _subQueryExpressionPartsAggregator.AddOuterJoinPart(outerMember, innerMember); } else { var outerSource = outerMember.Split('.')[0]; var innerSource = innerMember.Split('.')[0]; var groupJoinPart = $"{outerSource} LEFT OUTER JOIN {innerSource} ON ({outerMember} = {innerMember})"; // We're using the fact that the left source table was already added in AddFromPart var index = FromParts.IndexOf(outerSource); FromParts[index] = groupJoinPart; var groupingPart = $"(SELECT COUNT(*) FROM {innerSource} AS \"temp_{innerSource.Substring(1)} " + $"WHERE \"temp_{innerMember.Substring(1)} = {outerMember}) AS"; if (SelectPart.Contains(groupingPart)) { OrderByParts.Add(outerMember); OrderByParts.Add(innerMember); } } }
public override void VisitGroupJoinClause(GroupJoinClause groupJoinClause, QueryModel queryModel, int index) { _queryParts.AddOuterJoinPart( GetPsqlExpression(groupJoinClause.JoinClause.OuterKeySelector), GetPsqlExpression(groupJoinClause.JoinClause.InnerKeySelector)); base.VisitGroupJoinClause(groupJoinClause, queryModel, index); }