我正在尝试“过滤”我想要从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);
答案 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
并发送多个同步数据的请求。