protected override Provider VisitSkip(SkipProvider provider)
        {
            State.IsSkipTakeChain = true;
            var visitedSource = VisitCompilable(provider.Source);

            State.AddSkip(provider.Count);
            return(visitedSource);
        }
        protected override Provider VisitSkip(SkipProvider provider)
        {
            var source = VisitCompilable(provider.Source);

            EnsureAbsenceOfApplyProviderRequiringConversion();
            if (source != provider.Source)
            {
                return(new SkipProvider(source, provider.Count));
            }
            return(provider);
        }
        protected override Provider Visit(CompilableProvider cp)
        {
            var isPagingProvider = cp.Type.In(ProviderType.Take, ProviderType.Skip, ProviderType.Paging);

            if (isPagingProvider && !State.IsSkipTakeChain)
            {
                var visitedProvider = (CompilableProvider)base.Visit(cp);

                var requiresRowNumber = (State.Take != null && !takeSupported) || (State.Skip != null && !skipSupported);

                // add rownumber column (if needed)
                if (requiresRowNumber)
                {
                    // Arrray to avoid access to modified closure
                    string[] columnName = { String.Format(Strings.RowNumberX, rowNumberCount++) };
                    while (visitedProvider.Header.Columns.Any(column => column.Name == columnName[0]))
                    {
                        columnName[0] = String.Format(Strings.RowNumberX, rowNumberCount++);
                    }
                    visitedProvider = new RowNumberProvider(visitedProvider, columnName[0]);
                }

                if (State.Take != null && State.Skip != null)
                {
                    visitedProvider = new PagingProvider(visitedProvider, State.Skip, State.Take);
                }
                else if (State.Take != null)
                {
                    visitedProvider = new TakeProvider(visitedProvider, State.Take);
                }
                else
                {
                    visitedProvider = new SkipProvider(visitedProvider, State.Skip);
                }

                // add select removing RowNumber column
                if (requiresRowNumber)
                {
                    visitedProvider = new SelectProvider(
                        visitedProvider,
                        Enumerable.Range(0, visitedProvider.Header.Length - 1).ToArray());
                }

                return(visitedProvider);
            }

            if (!isPagingProvider && State.IsSkipTakeChain)
            {
                using (State.CreateScope())
                    return(base.Visit(cp));
            }

            return(base.Visit(cp));
        }
Example #4
0
 /// <inheritdoc/>
 protected override SqlProvider VisitSkip(SkipProvider provider)
 {
     if (providerInfo.Supports(ProviderFeatures.NativeSkip))
     {
         return(VisitPagingNative(provider, null, provider.Count));
     }
     if (providerInfo.Supports(ProviderFeatures.RowNumber))
     {
         return(VisitSkipRowNumber(provider));
     }
     throw new NotSupportedException(string.Format(Strings.ExXIsNotSupported, "Skip"));
 }
Example #5
0
        private SqlProvider VisitSkipRowNumber(SkipProvider provider)
        {
            var skipParameterBinding = CreateLimitOffsetParameterBinding(provider.Count);
            var bindings             = new List <QueryParameterBinding> {
                skipParameterBinding
            };
            var compiledSource = Compile(provider.Source);
            var source         = compiledSource.Request.Statement;
            var queryRef       = SqlDml.QueryRef(source);
            var query          = SqlDml.Select(queryRef);

            query.Columns.AddRange(queryRef.Columns.Cast <SqlColumn>());
            query.Where = queryRef.Columns.Last() > skipParameterBinding.ParameterReference;
            return(CreateProvider(query, bindings, provider, compiledSource));
        }
Example #6
0
 /// <summary>
 /// Compiles <see cref="SkipProvider"/>.
 /// </summary>
 /// <param name="provider">Skip provider.</param>
 protected abstract TResult VisitSkip(SkipProvider provider);