コード例 #1
0
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            this.values.Add(constantPlaceholder);

            this.maxIndex = Math.Max(constantPlaceholder.Index, this.maxIndex);

            return(base.VisitConstantPlaceholder(constantPlaceholder));
        }
コード例 #2
0
ファイル: Sql92QueryFormatter.cs プロジェクト: ciker/Shaolinq
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholderExpression)
        {
            if ((this.options & SqlQueryFormatterOptions.EvaluateConstantPlaceholders) != 0)
            {
                return(base.VisitConstantPlaceholder(constantPlaceholderExpression));
            }
            else
            {
                this.WriteFormat("$${0}", constantPlaceholderExpression.Index);

                return(constantPlaceholderExpression);
            }
        }
コード例 #3
0
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            var result = base.VisitConstant(constantPlaceholder.ConstantExpression);

            var retval = new SqlConstantPlaceholderExpression(constantPlaceholder.Index, (ConstantExpression)result);

            if (retval.Type.GetUnwrappedNullableType() == typeof(bool))
            {
                return(new BitBooleanExpression(retval));
            }

            return(retval);
        }
コード例 #4
0
        protected virtual Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            var result = this.VisitConstant(constantPlaceholder.ConstantExpression);

            if (constantPlaceholder.ConstantExpression != result)
            {
                if (!(result is ConstantExpression))
                {
                    return(result);
                }

                return(new SqlConstantPlaceholderExpression(constantPlaceholder.Index, (ConstantExpression)result));
            }

            return(constantPlaceholder);
        }
コード例 #5
0
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            var nullableType = constantPlaceholder.Type.MakeNullable();

            if (nullableType == constantPlaceholder.Type)
            {
                this.replacedExpressions.Add(constantPlaceholder);

                return(new SqlConstantPlaceholderExpression(this.placeholderCount++, Expression.Constant(null, nullableType)));
            }
            else
            {
                this.replacedExpressions.Add(new SqlConstantPlaceholderExpression(constantPlaceholder.Index, Expression.Constant(constantPlaceholder.ConstantExpression.Value, nullableType)));

                return(new SqlConstantPlaceholderExpression(this.placeholderCount++, Expression.Constant(null, nullableType)));
            }
        }
コード例 #6
0
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            if (this.placeholderValues != null)
            {
                var retval = Expression.ArrayIndex(this.placeholderValues, Expression.Constant(constantPlaceholder.Index));

                return(retval.Type == constantPlaceholder.Type ? retval : (Expression)Expression.Convert(retval, constantPlaceholder.Type));
            }
            else
            {
                if (constantPlaceholder.Index < this.placeholderValuesLiteral.Length)
                {
                    var retval = Expression.Constant(this.placeholderValuesLiteral[constantPlaceholder.Index]);

                    return(retval.Type == constantPlaceholder.Type ? retval : (Expression)Expression.Convert(retval, constantPlaceholder.Type));
                }
                else
                {
                    return(constantPlaceholder);
                }
            }
        }
コード例 #7
0
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            var newLength = this.values.Length;

            while (constantPlaceholder.Index > newLength - 1)
            {
                newLength *= 2;
            }

            if (newLength != this.values.Length)
            {
                Array.Resize(ref this.values, newLength);
            }

            values[constantPlaceholder.Index] = constantPlaceholder.ConstantExpression.Value;

            if (maxLength < constantPlaceholder.Index + 1)
            {
                maxLength = constantPlaceholder.Index + 1;
            }

            return(base.VisitConstantPlaceholder(constantPlaceholder));
        }
コード例 #8
0
ファイル: ProjectorFormatter.cs プロジェクト: shekky/Shaolinq
        protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            this.output.AppendFormat("$${0}", constantPlaceholder.Index);

            return(constantPlaceholder);
        }
コード例 #9
0
        protected IDbCommand BuildUpdateCommandForDeflatedPredicated(TypeDescriptor typeDescriptor, DataAccessObject dataAccessObject, bool valuesPredicated, bool primaryKeysPredicated, List <ObjectPropertyValue> updatedProperties, ObjectPropertyValue[] primaryKeys)
        {
            var constantPlaceholdersCount = 0;
            var assignments = new List <Expression>();
            var success     = false;

            var parameter1             = Expression.Parameter(typeDescriptor.Type);
            var requiresIdentityInsert = dataAccessObject.ToObjectInternal().HasAnyChangedPrimaryKeyServerSideProperties;

            foreach (var updated in updatedProperties)
            {
                var value       = updated.Value;
                var placeholder = updated.Value as Expression;

                if (placeholder == null)
                {
                    placeholder = (Expression) new SqlConstantPlaceholderExpression(constantPlaceholdersCount++, Expression.Constant(updated.Value, updated.PropertyType.CanBeNull() ? updated.PropertyType : updated.PropertyType.MakeNullable()));
                }

                if (placeholder.Type != updated.PropertyType)
                {
                    placeholder = Expression.Convert(placeholder, updated.PropertyType);
                }

                var m = TypeUtils.GetMethod(() => default(DataAccessObject).SetColumnValue(default(string), default(int)))
                        .GetGenericMethodDefinition()
                        .MakeGenericMethod(typeDescriptor.Type, updated.PropertyType);

                assignments.Add(Expression.Call(null, m, parameter1, Expression.Constant(updated.PersistedName), placeholder));
            }

            var parameter = Expression.Parameter(typeDescriptor.Type);

            if (primaryKeys.Length <= 0)
            {
                throw new InvalidOperationException("Expected more than 1 primary key");
            }

            Expression where = null;

            foreach (var primaryKey in primaryKeys)
            {
                var value       = primaryKey.Value;
                var placeholder = primaryKey.Value as Expression;

                if (placeholder == null)
                {
                    placeholder = new SqlConstantPlaceholderExpression(constantPlaceholdersCount++, Expression.Constant(value, primaryKey.PropertyType.CanBeNull() ? primaryKey.PropertyType : primaryKey.PropertyType.MakeNullable()));
                }

                if (placeholder.Type != primaryKey.PropertyType)
                {
                    placeholder = Expression.Convert(placeholder, primaryKey.PropertyType);
                }

                var pathComponents     = primaryKey.PropertyName.Split('.');
                var propertyExpression = pathComponents.Aggregate <string, Expression>(parameter, Expression.Property);
                var currentExpression  = Expression.Equal(propertyExpression, placeholder);

                where = where == null ? currentExpression : Expression.And(where, currentExpression);
            }

            var predicate = Expression.Lambda(where, parameter);
            var method    = TypeUtils.GetMethod(() => default(IQueryable <DataAccessObject>).UpdateHelper(default(Expression <Action <DataAccessObject> >), requiresIdentityInsert))
                            .GetGenericMethodDefinition()
                            .MakeGenericMethod(typeDescriptor.Type);

            var source     = Expression.Call(null, MethodInfoFastRef.QueryableWhereMethod.MakeGenericMethod(typeDescriptor.Type), Expression.Constant(this.DataAccessModel.GetDataAccessObjects(typeDescriptor.Type)), Expression.Quote(predicate));
            var selector   = Expression.Lambda(Expression.Block(assignments), parameter1);
            var expression = (Expression)Expression.Call(null, method, source, Expression.Quote(selector), Expression.Constant(requiresIdentityInsert));

            expression = SqlQueryProvider.Bind(this.DataAccessModel, this.sqlDataTypeProvider, expression);
            expression = SqlQueryProvider.Optimize(this.DataAccessModel, this.SqlDatabaseContext, expression);
            var projectionExpression = expression as SqlProjectionExpression;

            expression = projectionExpression.Select.From;

            var result = this.SqlDatabaseContext.SqlQueryFormatterManager.Format(expression);

            IDbCommand command = null;

            try
            {
                command = this.CreateCommand();

                command.CommandText = result.CommandText;

                var cachedValue = new SqlCachedUpdateInsertFormatValue {
                    formatResult = result
                };

                FillParameters(command, cachedValue, null, null);

                success = true;

                return(command);
            }
            finally
            {
                if (!success)
                {
                    command?.Dispose();
                }
            }
        }
コード例 #10
0
 protected override Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
 {
     return(Expression.Convert(Expression.ArrayIndex(this.dynamicParameters, Expression.Constant(constantPlaceholder.Index)), constantPlaceholder.ConstantExpression.Type));
 }
コード例 #11
0
        protected virtual Expression VisitConstantPlaceholder(SqlConstantPlaceholderExpression constantPlaceholder)
        {
            var result = this.VisitConstant(constantPlaceholder.ConstantExpression);

            return(new SqlConstantPlaceholderExpression(constantPlaceholder.Index, (ConstantExpression)result));
        }