我在我的项目中使用Azure Mobile Apps和TableControllers。到目前为止,发展进展顺利。我的一个表依赖于相当多的业务逻辑,以便将适当的实体返回给客户端。要执行此业务逻辑,我需要从客户端获取一些参数(特别是日期范围)。
我知道我可以使用APIController返回数据,但不会破坏实体同步Xamarin中SyncTables提供的实体?
我在GetAll中的当前逻辑是:
ModelSerializer
我想要的是能够以某种方式通过开始和结束日期,然后我可以使用它来建立我的WorkItemDTO对象列表。主要问题是WorkItem实体实际上可以生成多个WorkItemDTO对象,因为WorkItem可以设置为重复出现。例如,假设WorkItem每周重复一次,并且用户想要查看1个月的日历,那么单个WorkItem将生成4个单独的具体WorkItemDTO对象。
然后,当用户在客户端修改其中一个WorkItemDTO对象时,我希望将其作为创建自己的WorkItem实体的补丁发回。
有谁知道如何让TableController接收参数?或者如何使APIController工作以便客户端同步不受影响?
任何帮助都将不胜感激。
由于
雅各
答案 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
}
成功调用方法的参数化版本。我不完全确定从增量拉动角度来看会产生什么影响。