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)); }
/// <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")); }
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)); }
/// <summary> /// Compiles <see cref="SkipProvider"/>. /// </summary> /// <param name="provider">Skip provider.</param> protected abstract TResult VisitSkip(SkipProvider provider);