2016-03-08 70 views
3

如何为从IMobileServiceSyncTable<T>.PullAsync()方法返回的数据分页?如何处理使用IMobileServiceSyncTable和Azure移动服务的分页

我试着做这样的事情,但它不工作我没有料到:

myTableIMobileServiceTable<T>

mySyncTable是一个IMobileServiceSyncTable<T>

// Already tracking how many records exist 
// Note* Not using the sync table here, because that was not getting the correct results. 
// It seemed more correct to use the regular table so it was "live" data. 
var totalCount = myTable.Take(0).IncludeTotalCount().ToListAsync(); 

// Try and sync a "page" of data, limited by the values here 
var query = mySyncTable.Skip(count).Take(maxPerPage); 
await mySyncTable.PullAsync(null, query); 

// At this point, I expect the local store to have a set of data 
// So I try and get that "page" of data 
var results = await mySyncTable.ReadAsync(query); 

// That returns 0 results, so I tried 
var results = await mySyncTable.Skip(count).Take(maxPerPage).ToEnumerableAsync(); 

// Still 0 results, so just give me all the things 
var results = await mySyncTable.ToEnumerableAsync(); 

// Still 0... 

我越来越totalCount大于0,但是当我认为我正在从本地商店阅读时,我似乎无法通过跳过并取得结果。请建议如何正确分页来自同步表的数据。

回答

1

以下文件显示如何做分页:https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-dotnet-how-to-use-client-library/#paging

短版:

// Define a filtered query that skips the top 3 items and returns the next 3 items. 
MobileServiceTableQuery<TodoItem> query = todoTable 
       .Skip(3) 
       .Take(3); 
List<TodoItem> items = await query.ToListAsync(); 

Azure的移动应用有返回默认的50行的限制。要覆盖Mobile App后端的50行限制,还必须将EnableQueryAttribute应用于公共GET方法并指定分页行为。当施加到该方法中,以下将最大返回的行至1000:

[EnableQuery(MaxTop=1000)] 
+0

感谢您的回复。我找到了这些文档,这是我获得基本实施的地方。但是,这并不是专门针对“SyncTable”,这是我的困惑即将到来的地方。如果我不使用SyncTable,而只是使用IMobileServiceTable,它将按预期工作。问题是使用同步表,并分页同步/本地读取。 – therealjohn

2

开始时,你不能共享一个查询的跳过部分(或者甚至采取)服务器之间&客户端,因为数据集会有所不同。

同步10个记录(跳过10,取10,拉取记录10-20)的拉查询将导致本地表有10条记录(假设它没有启动)运行跳过10,取10在那里,会导致在本地找到0个记录。

否则,页面的实际代码应该一般用于获取记录X-Z。虽然您可能希望在排序顺序上排序(order by X),因为取决于Azure SQL的配置,所以默认顺序可能不会对齐。

现在确实出现了一些问题,因为第二个ReadAsync也没有回应结果。不幸的是,它可能是一些事情。

首先我会输出PullAsync的结果值,也可能是失败的原因,预计(数据不能推,到服务器的连接失败等)

如果这看起来不错,下一个最好的打赌是使像Fiddler这样的工具能够看到电线上发生了什么。客户端是否正确地调用/ tablename?$ skip = X & Take = Y,并且服务器返回200,结果如您所期望的那样?

通常这些步骤显示最常见的原因,如果全部检出,下一步可能会确认可同步的API写入&对表的读取很好(可能是表中的问题定义调用或SQL设置,本地等)

+0

你在第一句话中说得很好。我将不得不仔细检查这在我的情况下不是问题。我在两种情况下都以0-10开始,虽然这很容易引起您提到的问题,但我的方案与索引不同步不匹配。 我确实有相当数量的日志记录/错误处理,特别是在我的SyncHandler中,这似乎不是问题。我会进一步调查你的其他建议并回报。谢谢你的时间。 – therealjohn

+0

为了避免浪费,我会在这里奖励赏金,因为这个答案涉及同步表,并提供一些关于如何进一步调查的建议 - 希望能够找到我期待的答案。 – therealjohn