private static Expression BindResult<TSource,TResult>( PipelineBindingContext bindingContext, Expression<Func<TSource, TResult>> expression, IBsonSerializer<TSource> sourceSerializer) { var parameterExpression = new DocumentExpression(sourceSerializer); bindingContext.AddExpressionMapping(expression.Parameters[0], parameterExpression); var node = PartialEvaluator.Evaluate(expression.Body); node = Transformer.Transform(node); node = bindingContext.Bind(node); var resultSerializer = bindingContext.GetSerializer(node.Type, node); return new AggregateExpressionExpression(node, resultSerializer); }
private static Expression BindKeySelector <TKey, TDocument>(PipelineBindingContext bindingContext, Expression <Func <TDocument, TKey> > keySelector, IBsonSerializer <TDocument> parameterSerializer) { var parameterExpression = new DocumentExpression(parameterSerializer); bindingContext.AddExpressionMapping(keySelector.Parameters[0], parameterExpression); var node = PartialEvaluator.Evaluate(keySelector.Body); node = Transformer.Transform(node); node = bindingContext.Bind(node); var keySerializer = bindingContext.GetSerializer(node.Type, node); return(new GroupingKeyExpression(node, keySerializer)); }
public static RenderedProjectionDefinition <TResult> Translate <TDocument, TResult>(Expression <Func <TDocument, TResult> > projector, IBsonSerializer <TDocument> parameterSerializer, IBsonSerializerRegistry serializerRegistry) { var bindingContext = new PipelineBindingContext(serializerRegistry); var parameterExpression = new DocumentExpression(parameterSerializer); bindingContext.AddExpressionMapping(projector.Parameters[0], parameterExpression); var node = PartialEvaluator.Evaluate(projector.Body); node = Transformer.Transform(node); node = bindingContext.Bind(node); var projectionSerializer = bindingContext.GetSerializer(node.Type, node); var projection = TranslateProject(node); return(new RenderedProjectionDefinition <TResult>(projection, (IBsonSerializer <TResult>)projectionSerializer)); }
public static RenderedProjectionDefinition <TResult> Translate <TKey, TDocument, TResult>(Expression <Func <TDocument, TKey> > idProjector, Expression <Func <IGrouping <TKey, TDocument>, TResult> > groupProjector, IBsonSerializer <TDocument> parameterSerializer, IBsonSerializerRegistry serializerRegistry) { var bindingContext = new PipelineBindingContext(serializerRegistry); var keySelector = BindKeySelector(bindingContext, idProjector, parameterSerializer); var boundGroupExpression = BindGroup(bindingContext, groupProjector, parameterSerializer, keySelector); var projectionSerializer = bindingContext.GetSerializer(boundGroupExpression.Type, boundGroupExpression); var projection = AggregateLanguageTranslator.Translate(boundGroupExpression).AsBsonDocument; // must have an "_id" in a group document if (!projection.Contains("_id")) { var idProjection = AggregateLanguageTranslator.Translate(keySelector); projection.InsertAt(0, new BsonElement("_id", idProjection)); } return(new RenderedProjectionDefinition <TResult>(projection, (IBsonSerializer <TResult>)projectionSerializer)); }