2016-07-12 109 views
1

我在我的项目中使用Azure移动应用程序和TableControllers。直到现在,开发进行得相当顺利。我的一个表依赖于相当多的业务逻辑,以便将合适的实体返回给客户端。要执行此业务逻辑,我需要从客户端获取一些参数(特别是日期范围)。查询Azure移动应用程序TableController

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

我在我的GETALL目前的逻辑是:

public IQueryable<WorkItemDTO> GetAllWorkItem() 
    { 
     //Return all the work items that the user owns or has been assigned as a resource. 
     var query = MappedDomainManager.QueryEntity().Where(x => x.OwnerId == UserProfileId || x.Resources.Where(r => r.AssignedResourceId == UserProfileId).Count() > 0); 

     return query.Project().To<WorkItemDTO>(); 
    } 

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

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

有谁知道我怎么能得到一个TableController接收参数?或者如何让APIController工作,以便客户端同步不受影响?

任何帮助,将不胜感激。

感谢

雅各

+0

您是否需要查询参数在您的获取端点或Post/Patch/Delete端点上? –

+0

@ lindydonna-msft我只需要Get端点上的参数。邮政/补丁和删除将以正常的方式工作。这只是检索有问题的DTO的初始列表。 –

回答

3

在服务器上,您可以通过添加参数,用正确的名称和类型的查询参数添加到表控制器get方法很容易。通过传递dateFilter =值的查询参数

public IQueryable<WorkItemDTO> GetAllWorkItem(string dateFilter) 

这被称为:

例如,可以按如下方式添加dateFilter查询参数。您可以使用ASP.NET Web API在序列化中支持的任何数据类型。 (请注意,如果您没有不带查询参数的GetAll,如果您在没有此查询参数的情况下执行Get操作,则将获得不允许的HTTP 405方法。)

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

也就是说,如果您有一个参数为foo = bar且另一个参数为foo = baz的查询用于同一同步表,请确保使用两个不同的查询ID,一个包含“bar”,另一个包含“巴兹”。否则,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。)

+0

感谢您花时间查看此问题并提交必要的请求以解决此问题。我已经实现了委托处理程序来处理需要时的重新验证。在这种情况下,我认为(1)可能是对我而言最小的阻力路径,至少对于这个特定的用例来说。我需要通过的是日期范围,所以不需要通过CreateQuery()传递额外的查询参数。Where(.....)。这意味着我应该能够创建我的ODataString并将其传递。什么可能会出错:) –

+0

是的,这是有道理的。如果您有问题,请随时发布新问题。如果我的回答有帮助,请标记接受它。 :) –

+0

我终于回到了项目。我正在阅读github上的MobileServiceTableQuery 源代码,并且我遇到了一个名为WithParameters的方法,它似乎按照我的要求进行。你可以看看下面的帖子,看看这是否合理吗? –

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 
} 

该方法的参数化版本被成功调用。我只是不完全确定增量拉动观点的影响。

+0

是的,那可行!我没有意识到这种方法存在。我查看了代码和测试(并试用了它),它完全符合你的需求。我修改了我的答案。 –

相关问题