Пример #1
0
        protected virtual Expression VisitBatch(BatchExpression batch)
        {
            LambdaExpression operation = (LambdaExpression)Visit(batch.Operation);
            Expression       batchSize = Visit(batch.Size);
            Expression       stream    = Visit(batch.Stream);

            return(UpdateBatch(batch, batch.Input, operation, batchSize, stream));
        }
Пример #2
0
        protected BatchExpression UpdateBatch(BatchExpression batch, Expression input,
                                              LambdaExpression operation, Expression batchSize, Expression stream)
        {
            if (input != batch.Input || operation != batch.Operation ||
                batchSize != batch.Size || stream != batch.Stream)
            {
                return(new BatchExpression(input, operation, batchSize, stream));
            }

            return(batch);
        }
Пример #3
0
        protected virtual Expression BuildExecuteBatch(BatchExpression batch)
        {
            // parameterize query
            Expression operation = this.Parameterize(batch.Operation.Body);

            string       commandText = this.mapping.Language.Format(operation);
            var          namedValues = NamedValueGatherer.Gather(operation);
            QueryCommand command     = new QueryCommand(commandText, namedValues.Select(v => new QueryParameter(v.Name, v.Type, v.DbType)), null);

            Expression[] values = namedValues.Select(v => Expression.Convert(this.Visit(v.Value), typeof(object))).ToArray();

            Expression paramSets = Expression.Call(typeof(Enumerable), "Select", new Type[] { batch.Operation.Parameters[1].Type, typeof(object[]) },
                                                   batch.Input,
                                                   Expression.Lambda(Expression.NewArrayInit(typeof(object), values), new[] { batch.Operation.Parameters[1] })
                                                   );

            Expression plan = null;

            DbProjectionExpression projection = ProjectionFinder.FindProjection(operation);

            if (projection != null)
            {
                var saveScope = this.scope;
                ParameterExpression reader = Expression.Parameter(typeof(IDataReader), "r" + nReaders++);
                this.scope = new Scope(this.scope, reader, projection.Select.Alias, projection.Select.Columns);
                LambdaExpression projector = Expression.Lambda(this.Visit(projection.Projector), reader);
                this.scope = saveScope;

                var columns = ColumnGatherer.Gather(projection.Projector);
                command = new QueryCommand(command.CommandText, command.Parameters, columns);

                plan = Expression.Call(this.provider, "ExecuteBatch", new Type[] { projector.Body.Type },
                                       Expression.Constant(command),
                                       paramSets,
                                       projector,
                                       batch.Size,
                                       batch.Stream
                                       );
            }
            else
            {
                plan = Expression.Call(this.provider, "ExecuteBatch", null,
                                       Expression.Constant(command),
                                       paramSets,
                                       batch.Size,
                                       batch.Stream
                                       );
            }

            return(plan);
        }
Пример #4
0
 protected override Expression VisitBatch(BatchExpression batch)
 {
     if (this.mapping.Language.AllowsMultipleCommands || !IsMultipleCommands(batch.Operation.Body as DbStatementExpression))
     {
         return(this.BuildExecuteBatch(batch));
     }
     else
     {
         var source = this.Visit(batch.Input);
         var op     = this.Visit(batch.Operation.Body);
         var fn     = Expression.Lambda(op, batch.Operation.Parameters[1]);
         return(Expression.Call(this.GetType(), "Batch", new Type[] { source.Type.GetSequenceElementType(),
                                                                      batch.Operation.Body.Type }, source, fn, batch.Stream));
     }
 }
 protected BatchExpression UpdateBatch(BatchExpression batch, Expression input, 
     LambdaExpression operation, Expression batchSize, Expression stream)
 {
     if (input != batch.Input || operation != batch.Operation || 
         batchSize != batch.Size || stream != batch.Stream)
         return new BatchExpression(input, operation, batchSize, stream);
     
     return batch;
 }
        protected virtual Expression VisitBatch(BatchExpression batch)
        {
            LambdaExpression operation = (LambdaExpression)Visit(batch.Operation);
            Expression batchSize = Visit(batch.Size);
            Expression stream = Visit(batch.Stream);

            return UpdateBatch(batch, batch.Input, operation, batchSize, stream);
        }
 protected virtual bool CompareBatch(BatchExpression x, BatchExpression y)
 {
     return(Compare(x.Input, y.Input) && Compare(x.Operation, y.Operation) &&
            Compare(x.Size, y.Size) && Compare(x.Stream, y.Stream));
 }
 protected virtual bool CompareBatch(BatchExpression x, BatchExpression y)
 {
     return Compare(x.Input, y.Input) && Compare(x.Operation, y.Operation)
         && Compare(x.Size, y.Size) && Compare(x.Stream, y.Stream);
 }