示例#1
0
        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));
        }
示例#3
0
 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));
        }