2016-07-12 107 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

是的,那可行!我沒有意識到這種方法存在。我查看了代碼和測試(並試用了它),它完全符合你的需求。我修改了我的答案。 –

相關問題