protected virtual void SyncRequestedPage(PageRequest request, ViewPage page, DbConnection connection) { if (((request.SyncKey == null) || (request.SyncKey.Length == 0)) || (page.PageSize < 0)) return; List<DataField> keyFields = new List<DataField>(); foreach (DataField field in page.Fields) if (field.IsPrimaryKey) keyFields.Add(field); if ((keyFields.Count > 0) && (keyFields.Count == request.SyncKey.Length)) { DbCommand syncCommand = CreateCommand(connection); ConfigureCommand(syncCommand, page, CommandConfigurationType.Sync, null); bool useSkip = (_serverRules.EnableResultSet || SupportsSkipInSelect(syncCommand)); if (!(useSkip)) for (int i = 0; (i < keyFields.Count); i++) { DataField field = keyFields[i]; DbParameter p = syncCommand.CreateParameter(); p.ParameterName = String.Format("{0}PrimaryKey_{1}", _parameterMarker, field.Name); AssignParameterValue(p, field.Type, request.SyncKey[i]); syncCommand.Parameters.Add(p); } DbDataReader reader; if (_serverRules.EnableResultSet) reader = ExecuteResultSetReader(page); else reader = syncCommand.ExecuteReader(); if (!(useSkip)) { if (reader.Read()) { long rowIndex = Convert.ToInt64(reader[0]); page.PageIndex = Convert.ToInt32(Math.Floor((Convert.ToDouble((rowIndex - 1)) / Convert.ToDouble(page.PageSize)))); page.PageOffset = 0; } } else { long rowIndex = 1; List<int> keyFieldIndexes = new List<int>(); foreach (DataField pkField in keyFields) keyFieldIndexes.Add(reader.GetOrdinal(pkField.Name)); while (reader.Read()) { int matchCount = 0; foreach (int primaryKeyFieldIndex in keyFieldIndexes) if (Convert.ToString(reader[primaryKeyFieldIndex]) == Convert.ToString(request.SyncKey[matchCount])) matchCount++; else break; if (matchCount == keyFieldIndexes.Count) { page.PageIndex = Convert.ToInt32(Math.Floor((Convert.ToDouble((rowIndex - 1)) / Convert.ToDouble(page.PageSize)))); page.PageOffset = 0; page.ResetSkipCount(false); break; } else rowIndex++; } } reader.Close(); } }
DbDataReader ExecuteResultSetReader(ViewPage page) { if (_serverRules.ResultSet == null) return null; SelectClauseDictionary expressions = new SelectClauseDictionary(); foreach (DataColumn c in _serverRules.ResultSet.Columns) expressions[c.ColumnName] = c.ColumnName; if (page.Fields.Count == 0) { PopulatePageFields(page); EnsurePageFields(page, null); } DataView resultView = new DataView(_serverRules.ResultSet); resultView.Sort = page.SortExpression; using (DbConnection connection = CreateConnection(false)) { DbCommand command = connection.CreateCommand(); StringBuilder sb = new StringBuilder(); _resultSetParameters = command.Parameters; expressions.Add("_DataView_RowFilter_", "true"); AppendFilterExpressionsToWhere(sb, page, command, expressions, String.Empty); string filter = sb.ToString(); if (filter.StartsWith("where")) filter = filter.Substring(5); filter = Regex.Replace(filter, (Regex.Escape(_parameterMarker) + "\\w+"), DoReplaceResultSetParameter); resultView.RowFilter = filter; if (page.PageSize > 0) page.TotalRowCount = resultView.Count; } if (RequiresPreFetching(page)) page.ResetSkipCount(true); return resultView.ToTable().CreateDataReader(); }