public static ReadOnlyCollection <NamedValueExpression> Gather(Expression expr) { NamedValueGatherer gatherer = new NamedValueGatherer(); gatherer.Visit(expr); return(gatherer.namedValues.ToList <NamedValueExpression>().AsReadOnly()); }
private Expression ExecuteProjection(ProjectionExpression projection, bool okayToDefer) { projection = (ProjectionExpression)this.Parameterize(projection); if (this.scope != null) { projection = (ProjectionExpression)OuterParameterizer.Parameterize(this.scope.Alias, projection); } string commandText = this.linguist.Format(projection.Select); ReadOnlyCollection <NamedValueExpression> onlys = NamedValueGatherer.Gather(projection.Select); QueryCommand command = new QueryCommand(commandText, from v in onlys select new QueryParameter(v.Name, v.Type, v.QueryType)); Expression[] values = (from v in onlys select Expression.Convert(this.Visit(v.Value), typeof(object))).ToArray <UnaryExpression>(); return(this.ExecuteProjection(projection, okayToDefer, command, values)); }
protected virtual Expression BuildExecuteCommand(CommandExpression command) { Expression expression = this.Parameterize(command); string commandText = this.linguist.Format(expression); ReadOnlyCollection <NamedValueExpression> onlys = NamedValueGatherer.Gather(expression); QueryCommand command2 = new QueryCommand(commandText, from v in onlys select new QueryParameter(v.Name, v.Type, v.QueryType)); Expression[] values = (from v in onlys select Expression.Convert(this.Visit(v.Value), typeof(object))).ToArray <UnaryExpression>(); ProjectionExpression projection = ProjectionFinder.FindProjection(expression); if (projection != null) { return(this.ExecuteProjection(projection, false, command2, values)); } return(Expression.Call(this.executor, "ExecuteCommand", (Type[])null, new Expression[] { Expression.Constant(command2), Expression.NewArrayInit(typeof(object), values) })); }
protected virtual Expression BuildExecuteBatch(BatchExpression batch) { Expression expression = this.Parameterize(batch.Operation.Body); string commandText = this.linguist.Format(expression); ReadOnlyCollection <NamedValueExpression> onlys = NamedValueGatherer.Gather(expression); QueryCommand command = new QueryCommand(commandText, from v in onlys select new QueryParameter(v.Name, v.Type, v.QueryType)); Expression[] initializers = (from v in onlys select Expression.Convert(this.Visit(v.Value), typeof(object))).ToArray <UnaryExpression>(); Expression expression2 = Expression.Call(typeof(Enumerable), "Select", new Type[] { batch.Operation.Parameters[1].Type, typeof(object[]) }, new Expression[] { batch.Input, Expression.Lambda(Expression.NewArrayInit(typeof(object), initializers), new ParameterExpression[] { batch.Operation.Parameters[1] }) }); ProjectionExpression expression4 = ProjectionFinder.FindProjection(expression); if (expression4 != null) { Scope scope = this.scope; ParameterExpression fieldReader = Expression.Parameter(typeof(FieldReader), "r" + this.nReaders++); this.scope = new Scope(this.scope, fieldReader, expression4.Select.Alias, expression4.Select.Columns); LambdaExpression expression6 = Expression.Lambda(this.Visit(expression4.Projector), new ParameterExpression[] { fieldReader }); this.scope = scope; MappingEntity entity = EntityFinder.Find(expression4.Projector); command = new QueryCommand(command.CommandText, command.Parameters); return(Expression.Call(this.executor, "ExecuteBatch", new Type[] { expression6.Body.Type }, new Expression[] { Expression.Constant(command), expression2, expression6, Expression.Constant(entity, typeof(MappingEntity)), batch.BatchSize, batch.Stream })); } return(Expression.Call(this.executor, "ExecuteBatch", (Type[])null, new Expression[] { Expression.Constant(command), expression2, batch.BatchSize, batch.Stream })); }