protected SqlProvider CreateProvider(SqlSelect statement, QueryParameterBinding extraBinding, CompilableProvider origin, params ExecutableProvider[] sources) { var extraBindings = extraBinding != null?EnumerableUtils.One(extraBinding) : null; return(CreateProvider(statement, extraBindings, origin, sources)); }
/// <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)); }
private static object GetParameterValue(QueryParameterBinding binding) { try { return(binding.ValueAccessor.Invoke()); } catch (Exception exception) { throw new TargetInvocationException(Strings.ExExceptionHasBeenThrownByTheParameterValueAccessor, exception); } }
protected SqlExpression CreateIncludeViaComplexConditionExpression( IncludeProvider provider, Func <object> valueAccessor, IList <SqlExpression> sourceColumns, out QueryParameterBinding binding) { var filterTupleDescriptor = provider.FilteredColumnsExtractionTransform.Descriptor; var mappings = filterTupleDescriptor.Select(type => Driver.GetTypeMapping(type)); binding = new QueryRowFilterParameterBinding(mappings, valueAccessor); var resultExpression = SqlDml.DynamicFilter(binding); resultExpression.Expressions.AddRange(provider.FilteredColumns.Select(index => sourceColumns[index])); return(resultExpression); }
private QueryParameterBinding RegisterParameterBinding(TypeMapping mapping, Expression <Func <object> > accessor, QueryParameterBindingType bindingType) { QueryParameterBinding result; var identity = GetParameterIdentity(mapping, accessor, bindingType); if (identity == null) { result = new QueryParameterBinding(mapping, accessor.CachingCompile(), bindingType); otherBindings.Add(result); return(result); } if (bindingsWithIdentity.TryGetValue(identity, out result)) { return(result); } result = new QueryParameterBinding(mapping, accessor.CachingCompile(), bindingType); bindingsWithIdentity.Add(identity, result); return(result); }
/// <inheritdoc/> protected override SqlProvider VisitInclude(IncludeProvider provider) { var source = Compile(provider.Source); var resultQuery = ExtractSqlSelect(provider, source); var sourceColumns = ExtractColumnExpressions(resultQuery); var bindings = source.Request.ParameterBindings; var filterDataSource = provider.FilterDataSource.CachingCompile(); var requestOptions = QueryRequestOptions.Empty; SqlExpression resultExpression; TemporaryTableDescriptor tableDescriptor = null; QueryParameterBinding extraBinding = null; var algorithm = provider.Algorithm; if (!temporaryTablesSupported) { algorithm = IncludeAlgorithm.ComplexCondition; } switch (algorithm) { case IncludeAlgorithm.Auto: var complexConditionExpression = CreateIncludeViaComplexConditionExpression( provider, BuildRowFilterParameterAccessor(filterDataSource, true), sourceColumns, out extraBinding); var temporaryTableExpression = CreateIncludeViaTemporaryTableExpression( provider, sourceColumns, out tableDescriptor); resultExpression = SqlDml.Variant(extraBinding, complexConditionExpression, temporaryTableExpression); anyTemporaryTablesRequired = true; break; case IncludeAlgorithm.ComplexCondition: resultExpression = CreateIncludeViaComplexConditionExpression( provider, BuildRowFilterParameterAccessor(filterDataSource, false), sourceColumns, out extraBinding); if (!anyTemporaryTablesRequired) { requestOptions |= QueryRequestOptions.AllowOptimization; } break; case IncludeAlgorithm.TemporaryTable: resultExpression = CreateIncludeViaTemporaryTableExpression( provider, sourceColumns, out tableDescriptor); anyTemporaryTablesRequired = true; break; default: throw new ArgumentOutOfRangeException("provider.Algorithm"); } resultExpression = GetBooleanColumnExpression(resultExpression); var calculatedColumn = provider.Header.Columns[provider.Header.Length - 1]; AddInlinableColumn(provider, calculatedColumn, resultQuery, resultExpression); if (extraBinding != null) { bindings = bindings.Concat(EnumerableUtils.One(extraBinding)); } var request = CreateQueryRequest(Driver, resultQuery, bindings, provider.Header.TupleDescriptor, requestOptions); return(new SqlIncludeProvider(Handlers, request, tableDescriptor, filterDataSource, provider, source)); }