public Expression SimplifyIfPossible(
            SqlSubStatementExpression subStatementExpression,
            Expression unresolvedSelectProjection)
        {
            ArgumentUtility.CheckNotNull("subStatementExpression", subStatementExpression);
            ArgumentUtility.CheckNotNull("unresolvedSelectProjection", unresolvedSelectProjection);

            var resolvedSqlStatement = subStatementExpression.SqlStatement;

            if (IsSimplifiableGroupAggregate(resolvedSqlStatement))
            {
                var joinedGroupingTableInfo = (ResolvedJoinedGroupingTableInfo)resolvedSqlStatement.SqlTables[0].GetResolvedTableInfo();

                // Strip surrounding names so that there won't be a named expression inside the new aggregation
                var elementExpression = _context.RemoveNamesAndUpdateMapping(joinedGroupingTableInfo.AssociatedGroupingSelectExpression.ElementExpression);
                var visitor           = new SimplifyingVisitor(resolvedSqlStatement.SqlTables[0], elementExpression);

                var aggregationExpression = FindAggregationExpression(unresolvedSelectProjection);
                if (aggregationExpression == null)
                {
                    throw new ArgumentException(
                              "The unresolved projection doesn't match the resolved statement: it has no aggregation.",
                              "unresolvedSelectProjection");
                }
                var newAggregation = visitor.Visit(aggregationExpression);

                if (visitor.CanBeTransferredToGroupingSource)
                {
                    var resolvedNewAggregation = _stage.ResolveAggregationExpression(newAggregation, _context);

                    var aggregationName = joinedGroupingTableInfo.AssociatedGroupingSelectExpression.AddAggregationExpressionWithName(resolvedNewAggregation);

                    return(new SqlColumnDefinitionExpression(
                               resolvedSqlStatement.SelectProjection.Type,
                               joinedGroupingTableInfo.GroupSourceTableAlias,
                               aggregationName,
                               false));
                }
            }

            return(subStatementExpression);
        }
    public Expression SimplifyIfPossible (
        SqlSubStatementExpression subStatementExpression,
        Expression unresolvedSelectProjection)
    {
      ArgumentUtility.CheckNotNull ("subStatementExpression", subStatementExpression);
      ArgumentUtility.CheckNotNull ("unresolvedSelectProjection", unresolvedSelectProjection);

      var resolvedSqlStatement = subStatementExpression.SqlStatement;
      if (IsSimplifiableGroupAggregate (resolvedSqlStatement))
      {
        var joinedGroupingTableInfo = (ResolvedJoinedGroupingTableInfo) resolvedSqlStatement.SqlTables[0].GetResolvedTableInfo ();

        // Strip surrounding names so that there won't be a named expression inside the new aggregation
        var elementExpression = _context.RemoveNamesAndUpdateMapping (joinedGroupingTableInfo.AssociatedGroupingSelectExpression.ElementExpression);
        var visitor = new SimplifyingVisitor (resolvedSqlStatement.SqlTables[0], elementExpression);

        var aggregationExpression = FindAggregationExpression (unresolvedSelectProjection);
        if (aggregationExpression == null)
        {
          throw new ArgumentException (
              "The unresolved projection doesn't match the resolved statement: it has no aggregation.",
              "unresolvedSelectProjection");
        }
        var newAggregation = visitor.VisitExpression (aggregationExpression);

        if (visitor.CanBeTransferredToGroupingSource)
        {
          var resolvedNewAggregation = _stage.ResolveAggregationExpression (newAggregation, _context);

          var aggregationName = joinedGroupingTableInfo.AssociatedGroupingSelectExpression.AddAggregationExpressionWithName (resolvedNewAggregation);

          return new SqlColumnDefinitionExpression (
              resolvedSqlStatement.SelectProjection.Type,
              joinedGroupingTableInfo.GroupSourceTableAlias,
              aggregationName,
              false);
        }
      }

      return subStatementExpression;
    }