private static void LiftOrderBy( SelectExpression innerJoinSelectExpression, SelectExpression targetSelectExpression, TableExpressionBase innerJoinExpression) { var needOrderingChanges = innerJoinSelectExpression.OrderBy .Any(x => x.Expression is SelectExpression || x.Expression.IsAliasWithColumnExpression() || x.Expression.IsAliasWithSelectExpression()); var orderings = innerJoinSelectExpression.OrderBy.ToList(); if (needOrderingChanges) { innerJoinSelectExpression.ClearOrderBy(); } foreach (var ordering in orderings) { var orderingExpression = ordering.Expression; var aliasExpression = ordering.Expression as AliasExpression; if (aliasExpression?.Alias != null) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null) { orderingExpression = new ColumnExpression( aliasExpression.Alias, columnExpression.Property, columnExpression.Table); } } var index = orderingExpression is SelectExpression ? innerJoinSelectExpression.AddAliasToProjection(innerJoinSelectExpression.Alias + "_" + innerJoinSelectExpression.Projection.Count, orderingExpression) : innerJoinSelectExpression.AddToProjection(orderingExpression); var expression = innerJoinSelectExpression.Projection[index]; if (needOrderingChanges) { innerJoinSelectExpression.AddToOrderBy(new Ordering(expression.TryGetColumnExpression() ?? expression, ordering.OrderingDirection)); } var newExpression = targetSelectExpression.UpdateColumnExpression(expression, innerJoinExpression); targetSelectExpression.AddToOrderBy(new Ordering(newExpression, ordering.OrderingDirection)); } if ((innerJoinSelectExpression.Limit == null) && (innerJoinSelectExpression.Offset == null)) { innerJoinSelectExpression.ClearOrderBy(); } }