我有一个Azure表,我想在我的移动设备上脱机同步,如果我传递单个where
子句,如下所示,一切正常
var query = todoTable.CreateQuery().Where(c => c.Id == "some id here");
await todoTable.PullAsync(null, query);
但我有List
,其中包含多个ID,例如
List<string> IDS = new List<string>();
IDS.Add("Some ID 1");
IDS.Add("Some ID 2");
我试图在我的查询中将其传递给以下内容,仅获取具有特定ID的项目
var query = todoTable.CreateQuery().Where(c => IDS.Contains(c.Id));
await todoTable.PullAsync(null, query);
但这似乎不起作用,
有办法做到这一点吗?
答案 0 :(得分:2)
var query = todoTable.CreateQuery()。其中(c =&gt; IDS.Contains(c.Id));
等待todoTable.PullAsync(null,query);
根据我的理解,您的拉取操作会针对您的移动后端执行以下请求:
GET https://{your-app-name}.azurewebsites.net/tables/{your-table-name}?$filter=((id eq 'Some ID 1') or (id eq 'Some ID 2'))
<强> TEST:强>
根据我的测试,上面的拉动操作可以按预期在我身边工作。我建议您在调用pull操作时使用fiddler捕获网络跟踪,以确保您可以按预期检索记录。此外,您可以关注Debugging the Offline Cache。
<强>更新强>
我在C#移动应用后端检查了此问题,以缩小此问题的范围。我在config.IncludeErrorDetailPolicy
下将IncludeErrorDetailPolicy.Always
设置为Startup.MobileApp.cs
,以检索详细的错误消息。我发现我可能会遇到以下错误:
我假设我们可能会点击ODataValidationSettings.MaxNodeCount,它用于确定$ filter语法树中节点的最大值。然后,我按如下方式修改了我的操作以增加MaxNodeCount限制,并发现查询可以按预期工作。
[EnableQuery(MaxNodeCount =1000)]
public IQueryable<ToDoItem> GetAllTodoItems()