private Expression BindSelector(ProjectionExpression projection, ProjectionBindingContext context, Expression id, Expression node) { var lambda = ExtensionExpressionVisitor.GetLambda(node); var binder = new AccumulatorBinder(context.GroupMap, context.SerializerRegistry); var serializer = SerializerBuilder.Build(projection.Projector, context.SerializerRegistry); var sequenceSerializer = (IBsonSerializer)Activator.CreateInstance( typeof(ArraySerializer <>).MakeGenericType(projection.Projector.Type), new object[] { serializer }); var sequenceInfo = new BsonSerializationInfo( null, sequenceSerializer, sequenceSerializer.ValueType); var sequenceExpression = new SerializationExpression( lambda.Parameters[1], sequenceInfo); binder.RegisterParameterReplacement(lambda.Parameters[0], id); binder.RegisterParameterReplacement(lambda.Parameters[1], sequenceExpression); var correlationId = Guid.NewGuid(); context.GroupMap.Add(sequenceExpression, correlationId); var bound = binder.Bind(lambda.Body); return(CorrelatedAccumulatorRemover.Remove(bound, correlationId)); }
private static Expression BindGroup <TKey, TDocument, TResult>(PipelineBindingContext bindingContext, Expression <Func <IGrouping <TKey, TDocument>, TResult> > groupProjector, IBsonSerializer <TDocument> parameterSerializer, Expression keySelector) { var groupSerializer = new ArraySerializer <TDocument>(parameterSerializer); var groupExpression = new DocumentExpression(groupSerializer); var correlationId = Guid.NewGuid(); bindingContext.AddCorrelatingId(groupExpression, correlationId); bindingContext.AddExpressionMapping(groupProjector.Parameters[0], groupExpression); bindingContext.AddMemberMapping(typeof(IGrouping <TKey, TDocument>).GetProperty("Key"), keySelector); var node = PartialEvaluator.Evaluate(groupProjector.Body); node = Transformer.Transform(node); node = bindingContext.Bind(node); return(CorrelatedAccumulatorRemover.Remove(node, correlationId)); }
private Expression BindSelector(PipelineExpression pipeline, PipelineBindingContext bindingContext, Expression keySelector, Expression node) { var lambda = ExpressionHelper.GetLambda(node); var serializer = bindingContext.GetSerializer(pipeline.Projector.Type, pipeline.Projector); var sequenceSerializer = (IBsonSerializer)Activator.CreateInstance( typeof(ArraySerializer <>).MakeGenericType(pipeline.Projector.Type), new object[] { serializer }); var sequence = new DocumentExpression(sequenceSerializer); var keySerializer = bindingContext.GetSerializer(keySelector.Type, keySelector); Guid correlationId = Guid.NewGuid(); bindingContext.AddCorrelatingId(sequence, correlationId); bindingContext.AddExpressionMapping(lambda.Parameters[0], new GroupingKeyExpression(keySelector, keySerializer)); bindingContext.AddExpressionMapping(lambda.Parameters[1], sequence); var bound = bindingContext.Bind(lambda.Body); return(CorrelatedAccumulatorRemover.Remove(bound, correlationId)); }