将特定数据从 Azure 同步到 Xamarin(离线同步)

Sync specific data from Azure to Xamarin (Offline sync)

我正在尝试 "filter" 我想从 Azure 同步哪些数据。但是我似乎无法让 "Where" 工作。有什么想法吗?

var allItems = await GetMyListItems();
var myIdsInList = allEdrops.Select(c => c.Id.ToLower()).ToList();

这个不行:

var query = this.myTable.CreateQuery().Where(c => myIdsInList.Contains(c.Id.ToLower())); //DONT WORK

这个有效(但得到所有我不想要的值)

var query = this.myTable.CreateQuery();  //WORKS

await this.myTable.PullAsync("allmyTableItems", query);

MobileServiceClient 中使用 SyncTable 并附加任何 LINQ 查询。

readonly MobileServiceClient _mobileServiceClient = new MobileServiceClient("Azure Mobile App URL");

async Task<List<MyModel>> GetItems()
{
    return await _mobileServiceClient.GetSyncTable<MyModel>().Where(c => myIdsInList.Contains(c.Id.ToLower())).ToListAsync().ConfigureAwait(false);
}

这是一个通用的class,我使用客户端 SDK 与 Azure 移动应用交互:https://github.com/brminnick/UITestSampleApp/blob/master/Src/UITestSampleApp/Services/AzureService.cs

使用 fiddler 捕获网络跟踪,您会发现您的过滤器查询如下所示:

GET https://{your-app-name}.azurewebsites.net/tables/{table-name}?$filter=((((((((((id eq '1') or (id eq '2')) or (id eq '3')) or (id eq '4')) or (id eq '5')) or (id eq '6')) or (id eq '7')) or (id eq '8')) or (id eq '9')) or (id eq '10'))

对于少量的 ID,我可以按预期检索记录。对于您的情况,您可以触摸 requestLimits from the Web server (IIS). For C# backend, you may also need to improve the maxQueryStringLength under httpRuntime Element 下的 maxQueryString for ASP.NET run-time。

此外,您可以点击 ODataValidationSettings.MaxNodeCount 用于确定 $filter 语法树中节点的最大值。

要解决此问题,您可以 Enable diagnostics logging for your mobile app, then you could log into KUDU to view the log files or just log into Azure Portal to check the stream logging under "MONITORING > Log stream" blade of your mobile app. Additionally, for C# backend, you could follow this similar to set MaxNodeCount. For Node.js backend, I did not find any tutorials, you could follow 30 DAYS OF AZURE MOBILE APPS 进行调查,或者您可能需要迭代 Ids 并发送多个同步数据的请求。