// public static methods public static AstPipeline Translate(TranslationContext context, MethodCallExpression expression) { var method = expression.Method; var arguments = expression.Arguments; if (method.IsOneOf(__groupByMethods)) { var sourceExpression = arguments[0]; var pipeline = ExpressionToPipelineTranslator.Translate(context, sourceExpression); var sourceSerializer = pipeline.OutputSerializer; var keySelectorLambda = ExpressionHelper.UnquoteLambda(arguments[1]); var keySelectorTranslation = ExpressionToAggregationExpressionTranslator.TranslateLambdaBody(context, keySelectorLambda, sourceSerializer, asRoot: true); var keySerializer = keySelectorTranslation.Serializer; var(elementAst, elementSerializer) = TranslateElement(context, method, arguments, sourceSerializer); var groupingSerializer = IGroupingSerializer.Create(keySerializer, elementSerializer); pipeline = pipeline.AddStages( groupingSerializer, AstStage.Group( id: keySelectorTranslation.Ast, fields: AstExpression.AccumulatorField("_elements", AstAccumulatorOperator.Push, elementAst))); if (method.IsOneOf(__groupByWithResultSelectorMethods)) { pipeline = TranslateResultSelector(context, pipeline, arguments, keySerializer, elementSerializer); } return(pipeline); } throw new ExpressionNotSupportedException(expression); }
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); }