Exemplo n.º 1
0
        /// <inheritdoc/>
        protected override SqlProvider VisitSeek(SeekProvider provider)
        {
            var compiledSource = Compile(provider.Source);

            SqlSelect source            = compiledSource.Request.Statement;
            var       query             = source.ShallowClone();
            var       parameterBindings = new List <QueryParameterBinding>();
            var       typeIdColumnName  = Handlers.NameBuilder.TypeIdColumnName;
            Func <KeyValuePair <int, Direction>, bool> filterNonTypeId =
                pair => ((MappedColumn)provider.Header.Columns[pair.Key]).ColumnInfoRef.ColumnName != typeIdColumnName;
            var keyColumns = provider.Header.Order
                             .Where(filterNonTypeId)
                             .ToList();

            for (int i = 0; i < keyColumns.Count; i++)
            {
                int         columnIndex = keyColumns[i].Key;
                var         sqlColumn   = query.Columns[columnIndex];
                var         column      = provider.Header.Columns[columnIndex];
                TypeMapping typeMapping = Driver.GetTypeMapping(column.Type);
                var         binding     = new QueryParameterBinding(typeMapping, GetSeekKeyElementAccessor(provider.Key, i));
                parameterBindings.Add(binding);
                query.Where &= sqlColumn == binding.ParameterReference;
            }

            return(CreateProvider(query, parameterBindings, provider, compiledSource));
        }
Exemplo n.º 2
0
        /// <inheritdoc/>
        protected override SqlProvider VisitAlias(AliasProvider provider)
        {
            var source = Compile(provider.Source);

            SqlSelect sourceSelect = source.Request.Statement;
            var       sqlSelect    = sourceSelect.ShallowClone();
            var       columns      = sqlSelect.Columns.ToList();

            sqlSelect.Columns.Clear();
            for (int i = 0; i < columns.Count; i++)
            {
                var columnName = provider.Header.Columns[i].Name;
                columnName = ProcessAliasedName(columnName);
                var column     = columns[i];
                var columnRef  = column as SqlColumnRef;
                var columnStub = column as SqlColumnStub;
                if (!ReferenceEquals(null, columnRef))
                {
                    sqlSelect.Columns.Add(SqlDml.ColumnRef(columnRef.SqlColumn, columnName));
                }
                else if (!ReferenceEquals(null, columnStub))
                {
                    sqlSelect.Columns.Add(columnStub);
                }
                else
                {
                    sqlSelect.Columns.Add(column, columnName);
                }
            }
            return(CreateProvider(sqlSelect, provider, source));
        }
Exemplo n.º 3
0
        /// <inheritdoc/>
        protected override SqlProvider VisitCalculate(CalculateProvider provider)
        {
            var source = Compile(provider.Source);

            SqlSelect sqlSelect;

            if (provider.Source.Header.Length == 0)
            {
                SqlSelect sourceSelect = source.Request.Statement;
                sqlSelect = sourceSelect.ShallowClone();
                sqlSelect.Columns.Clear();
            }
            else
            {
                sqlSelect = ExtractSqlSelect(provider, source);
            }

            var sourceColumns = ExtractColumnExpressions(sqlSelect);
            var allBindings   = EnumerableUtils <QueryParameterBinding> .Empty;

            foreach (var column in provider.CalculatedColumns)
            {
                var result    = ProcessExpression(column.Expression, sourceColumns);
                var predicate = result.First;
                var bindings  = result.Second;
                if (column.Type.StripNullable() == typeof(bool))
                {
                    predicate = GetBooleanColumnExpression(predicate);
                }
                AddInlinableColumn(provider, column, sqlSelect, predicate);
                allBindings = allBindings.Concat(bindings);
            }
            return(CreateProvider(sqlSelect, allBindings, provider, source));
        }