예제 #1
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);
        }
예제 #2
0
 public QueryableExecutionModel BuildExecutionModel(Expression expression)
 {
     return(QueryableExecutionModelBuilder.Build(
                Prepare(expression),
                _collection.Settings.SerializerRegistry));
 }