public static QueryableExecutionModel Build(Expression node, IBsonSerializerRegistry serializerRegistry)
        {
            var builder = new QueryableExecutionModelBuilder(serializerRegistry);
            builder.Visit(node);

            return (QueryableExecutionModel)Activator.CreateInstance(
                typeof(AggregateQueryableExecutionModel<>).MakeGenericType(builder._serializer.ValueType),
                builder._stages,
                builder._serializer);
        }
        public static QueryableExecutionModel Build(Expression node, IBsonSerializerRegistry serializerRegistry)
        {
            var builder = new QueryableExecutionModelBuilder(serializerRegistry);

            builder.Visit(node);

            return((QueryableExecutionModel)Activator.CreateInstance(
                       typeof(AggregateQueryableExecutionModel <>).MakeGenericType(builder._serializer.ValueType),
                       builder._stages,
                       builder._serializer));
        }
示例#3
0
        protected internal override Expression VisitProjection(ProjectionExpression node)
        {
            var model = QueryableExecutionModelBuilder.Build(node, _serializerRegistry);

            Expression executor;

            if (_cancellationToken != null)
            {
                // we are async
                executor = Expression.Call(
                    _provider,
                    "ExecuteAsync",
                    Type.EmptyTypes,
                    Expression.Constant(model, typeof(QueryableExecutionModel)),
                    _cancellationToken);

                if (node.Aggregator != null)
                {
                    executor = Expression.Invoke(
                        node.Aggregator,
                        Expression.Convert(executor, node.Aggregator.Parameters[0].Type),
                        _cancellationToken);
                }
            }
            else
            {
                // we are sync
                executor = Expression.Call(
                    _provider,
                    "Execute",
                    Type.EmptyTypes,
                    Expression.Constant(model, typeof(QueryableExecutionModel)));

                if (node.Aggregator != null)
                {
                    executor = Expression.Invoke(
                        node.Aggregator,
                        Expression.Convert(executor, node.Aggregator.Parameters[0].Type));
                }
            }

            return(executor);
        }
示例#4
0
 public QueryableExecutionModel BuildExecutionModel(Expression expression)
 {
     return(QueryableExecutionModelBuilder.Build(
                Prepare(expression),
                _collection.Settings.SerializerRegistry));
 }