/// <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)); }
/// <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)); }
/// <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)); }