Пример #1
0
        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));
        }
Пример #3
0
        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));
        }
Пример #4
0
            public static Expression Remove(Expression node, Guid correlationId)
            {
                var remover = new CorrelatedAccumulatorRemover(correlationId);

                return(remover.Visit(node));
            }
 public static Expression Remove(Expression node, Guid correlationId)
 {
     var remover = new CorrelatedAccumulatorRemover(correlationId);
     return remover.Visit(node);
 }