Azure 离线同步 - 如何使用 "Contains"

Azure Offline Sync - How to use "Contains"

我有一个 Azure Table,我想在我的移动设备上离线同步它,如果我通过单个 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);

但这似乎不起作用,

有办法吗?

var query = todoTable.CreateQuery().Where(c => IDS.Contains(c.Id));

await 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'))

测试:

根据我的测试,上述拉取操作在我这边可以正常工作。我建议你使用 fiddler to capture the network trace when invoking the pull operation to make sure that you could retrieve the records as expected. Moreover, you could follow Debugging the Offline Cache.

更新:

我在我的 C# 移动应用后端检查了这个问题以缩小这个问题的范围。我在 Startup.MobileApp.cs 下将 config.IncludeErrorDetailPolicy 设置为 IncludeErrorDetailPolicy.Always 以检索详细的错误消息。而且我发现我可能会遇到以下错误:

我假设我们可能会遇到 ODataValidationSettings.MaxNodeCount,它用于确定 $filter 语法树中节点的最大值。然后,我如下装饰我的操作以增加 MaxNodeCount 限制,发现查询可以按预期工作。

[EnableQuery(MaxNodeCount =1000)]
public IQueryable<ToDoItem> GetAllTodoItems()