将特定数据从Azure同步到Xamarin(脱机同步)

时间:2018-04-03 14:23:26

标签: azure xamarin synchronization azure-mobile-services

我正在尝试“过滤”我想要从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);

2 个答案:

答案 0 :(得分:1)

使用SyncTable中的MobileServiceClient并附加任何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);
}

以下是我用于使用客户端SDK与Azure移动应用进行交互的通用类:https://github.com/brminnick/UITestSampleApp/blob/master/Src/UITestSampleApp/Services/AzureService.cs

答案 1 :(得分:0)

使用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,我可以按预期检索记录。对于您的方案,您可以从Web服务器(IIS)触摸requestLimits下的maxQueryString。对于C#后端,您可能还需要改进ASP.NET运行时httpRuntime Element下的maxQueryStringLength

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

要解决此问题,您可以Enable diagnostics logging用于移动应用,然后您可以登录KUDU查看日志文件,或者只需登录Azure门户以检查&#34; MONITORING&gt;下的流记录。记录流&#34;你的移动应用程序的刀片。此外,对于C#后端,您可以按照类似的issue来设置MaxNodeCount。对于Node.js后端,我没有找到任何教程,您可以按30 DAYS OF AZURE MOBILE APPS进行调查,或者您可能需要迭代Ids并发送多个同步数据的请求。