public void PipelineStageDefinitionBuilder_GroupForLinq3_with_expressions_should_throw_with_LINQ2()
        {
            var(groupStageDefinition, projectStageDefinition) = PipelineStageDefinitionBuilder.GroupForLinq3((BsonDocument x) => 1, x => new { Count = x.Count() });

            var exception = Record.Exception(() => Linq3TestHelpers.Render(groupStageDefinition, BsonDocumentSerializer.Instance, LinqProvider.V2));

            exception.Should().BeOfType <InvalidOperationException>();
        }
 /// <summary>
 /// Appends a group stage to the pipeline.
 /// </summary>
 /// <typeparam name="TResult">The type of the result.</typeparam>
 /// <typeparam name="TKey">The type of the key.</typeparam>
 /// <typeparam name="TNewResult">The type of the new result.</typeparam>
 /// <param name="aggregate">The aggregate.</param>
 /// <param name="id">The id.</param>
 /// <param name="group">The group projection.</param>
 /// <returns>
 /// The fluent aggregate interface.
 /// </returns>
 public static IAggregateFluent <TNewResult> Group <TResult, TKey, TNewResult>(this IAggregateFluent <TResult> aggregate, Expression <Func <TResult, TKey> > id, Expression <Func <IGrouping <TKey, TResult>, TNewResult> > group)
 {
     Ensure.IsNotNull(aggregate, nameof(aggregate));
     if (aggregate.Database.Client.Settings.LinqProvider == LinqProvider.V2)
     {
         return(aggregate.AppendStage(PipelineStageDefinitionBuilder.Group(id, group)));
     }
     else
     {
         var(groupStage, projectStage) = PipelineStageDefinitionBuilder.GroupForLinq3(id, group);
         return(aggregate.AppendStage(groupStage).AppendStage(projectStage));
     }
 }
        public void PipelineStageDefinitionBuilderGroupForLinq3_with_expressions_should_work_with_LINQ3()
        {
            var(groupStageDefinition, projectStageDefinition) = PipelineStageDefinitionBuilder.GroupForLinq3((BsonDocument x) => 1, x => new { Count = x.Count() });

            var groupStage         = Linq3TestHelpers.Render(groupStageDefinition, BsonDocumentSerializer.Instance, LinqProvider.V3);
            var groupingSerializer = new IGroupingSerializer <int, BsonDocument>(new Int32Serializer(), BsonDocumentSerializer.Instance);
            var projectStage       = Linq3TestHelpers.Render(projectStageDefinition, groupingSerializer, LinqProvider.V3);
            var expectedStages     = new[]
            {
                "{ $group : { _id : 1, __agg0 : { $sum : 1 } } }",
                "{ $project : { Count : '$__agg0', _id : 0 } }"
            };

            Linq3TestHelpers.AssertStages(new[] { groupStage, projectStage }, expectedStages);
        }