Xamarin Forms拉异步表。默认情况下,CreateQuery()已添加OFFSET

时间:2018-08-15 15:38:10

标签: c# azure xamarin.forms synchronization

想知道以前是否有人看过它,如果知道的话,他们如何对其进行排序

我在Xamarin Forms中对azure数据进行拉动异步

if (!CrossConnectivity.Current.IsConnected) { return; }
                table = Client.GetSyncTable<T>();
                var pullOptions = new PullOptions() { MaxPageSize = 100 };

                IMobileServiceTableQuery<T> query = table.CreateQuery();
                if(Client.SyncContext.IsInitialized)
                await table.PullAsync("qryAllEvents", query, pullOptions);

我知道这应该带回5条记录。

在检查Sql Profiler并将断点放到node.js后端时,我看到运行了2个查询,一个查询的OFFSET 0,另一个查询的OFFSET 5,因此将删除所有5条记录。

SELECT * FROM [dbo].[Events] WHERE ([updatedAt] >= @p1) ORDER BY [updatedAt] OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY; ',@params=N'@p1 datetimeoffset(7)',@p1='1970-01-01 00:00:00 +00:00'


SELECT * FROM [dbo].[Events] WHERE ([updatedAt] >= @p1) ORDER BY [updatedAt] OFFSET 5 ROWS FETCH NEXT 50 ROWS ONLY; ',@params=N'@p1 datetimeoffset(7)',@p1='1970-01-01 00:00:00 +00:00'

该偏移量如何最终出现在table.CreateQuery()产生的查询中,有什么办法可以防止这种情况发生,所以我可以返回行?

1 个答案:

答案 0 :(得分:1)

此偏移量如何最终出现在table.CreateQuery()...的查询中?

SDK将偏移量设置为等于拉动光标的位置。

来自GitHub

if (offset.HasValue)
{
    this.sql.AppendFormat(" OFFSET {0}", offset.Value);
}

也取自GitHub

internal class PullCursor
{
    public int Position
    {
        get { return this.initialSkip + this.totalRead; }
    }

...有什么办法可以防止这种情况发生,以便我返回行?

您的第一个查询没有偏移地运行(cursor.Position为0),然后SDK将偏移量增加了总读取量。 SDK会增加读取的总数,这告诉我您正在返回行。我认为SDK收到结果并保留到本地存储时出了点问题。这是与您类似的SO question。一条答复建议启用SQLite日志记录以获取更多信息,并解释两次调用API的原因。