查询Azure移动应用程序TableController

时间:2016-07-12 04:05:24

标签: entity-framework azure xamarin azure-mobile-services

我在我的项目中使用Azure Mobile Apps和TableControllers。到目前为止,发展进展顺利。我的一个表依赖于相当多的业务逻辑,以便将适当的实体返回给客户端。要执行此业务逻辑,我需要从客户端获取一些参数(特别是日期范围)。

我知道我可以使用API​​Controller返回数据,但不会破坏实体同步Xamarin中SyncTables提供的实体?

我在GetAll中的当前逻辑是:

ModelSerializer

我想要的是能够以某种方式通过开始和结束日期,然后我可以使用它来建立我的WorkItemDTO对象列表。主要问题是WorkItem实体实际上可以生成多个WorkItemDTO对象,因为WorkItem可以设置为重复出现。例如,假设WorkItem每周重复一次,并且用户想要查看1个月的日历,那么单个WorkItem将生成4个单独的具体WorkItemDTO对象。

然后,当用户在客户端修改其中一个WorkItemDTO对象时,我希望将其作为创建自己的WorkItem实体的补丁发回。

有谁知道如何让TableController接收参数?或者如何使APIController工作以便客户端同步不受影响?

任何帮助都将不胜感激。

由于

雅各

2 个答案:

答案 0 :(得分:3)

在服务器上,您可以通过添加具有正确名称和类型的参数,轻松地将查询参数添加到表控制器get方法。

例如,您可以添加dateFilter查询参数,如下所示:

public IQueryable<WorkItemDTO> GetAllWorkItem(string dateFilter)

这将通过传递dateFilter = value查询参数来调用。您可以使用ASP.NET Web API在序列化中支持的任何数据类型。 (请注意,如果您没有不带查询参数的GetAll,那么如果您执行不带此查询参数的Get,则将获得Http 405方法。)

在客户端上,如@JacobJoz所述,您只需使用方法IMobileServiceTableQuery.WithParameters来构建传递给PullAsync的查询。如果对同一个表有多个增量同步查询,并且它们对参数使用不同的值,则应确保将这些值包含在queryId中以进行提取。

也就是说,如果您有一个参数foo = bar的查询和另一个同一个同步表的foo = baz,请确保使用两个不同的查询ID,一个包含“bar”,另一个包含“baz” ”。否则,2个增量同步可能会相互干扰,因为queryId用作保存该同步表的上次更新时间戳的密钥。请参阅How offline synchronization works

遗憾的是,部分传递查询参数是脱机同步拉取的一部分。脱机同步仅适用于表控制器,FYI。

PullAsync有一个重载的扩展方法,它接受参数字典,但不幸的是它需要字符串查询而不是IMobileServiceTableQuery

PullAsync(this IMobileServiceSyncTable table, string queryId, string query, IDictionary<string, string> parameters, CancellationToken cancellationToken)

(我已经提交了一个错误来解决这个问题:Add a generic PullAsync overload that accepts query parameters)。

问题在于,没有简单的方法可以将IMobileServiceTableQuery转换为OData查询字符串,因为您需要访问内部SDK方法。 (我提出了另一个问题:Add extension method ToODataString for IMobileServiceTableQuery。)

答案 1 :(得分:1)

我在github上查看了MobileServiceTableQuery的源代码。看起来它暴露了一个名为WithParameters的方法。我已经将该方法调用链接到CreateQuery以生成对服务器的查询,并且它似乎做了我想要的。

以下是客户端代码:

var parameters = new Dictionary<string, string>();
parameters.Add("v1", "hello");

var query = WorkItemTable.CreateQuery().WithParameters(parameters);
await WorkItemTable.PullAsync("RetrieveWorkItems", query);

在服务器上,我有一个GetAll实现,如下所示:

public IQueryable<WorkItem> GetAllWorkItem(string v1)
{
    //return IQueryable after processing business logic based on parameter
}

成功调用方法的参数化版本。我不完全确定从增量拉动角度来看会产生什么影响。