2013-06-24 38 views
0

我想運行一個查詢與字符串列上的篩選器,但在運行時,一些過濾器值(例如'PO Box 27')導致失敗的查詢。嘗試過濾時,我的查詢失敗並顯示錯誤消息:「字符串」郵政信箱27「不是有效的TimeSpan值。」BreezeJS查詢過濾器字符串是不是一個有效的TimeSpan值

代碼: VAR crmAccountsQuery = EntityQuery 。從( 'crmAccountEFs') 。凡(breeze.Predicate.create( 'ADDRESS1_LINE1', '當量', 'ABC'));

return manager.executeQuery(crmAccountsQuery) 
    .then(function (data) { 
     crmAccountsObservable(data.results); 
     return; 
    }) 
    .fail(queryFailed); 

客戶端上的breeze.js建立就像一個網址:

http://localhost:49800/breeze/BreezeDb/crmAccountEFs?$filter=(Address1_Line1%20eq%20time'PO%20Box%2027') 

的時間打字是完全錯誤的。

編輯: 相關:BreezeJS malformed OData query Url when using "startsWith"

回答

0

對於其他人受益,我發現了意想不到的答案。原來'從'entityType的情況是錯誤的(CrmAccountEFs),但不會引發錯誤。服務器處理大小寫更改,並且客戶端自動回退到匿名類型(因爲代碼嘗試處理投影查詢)。這在EntityQuery._getFromEntityType()中。

結果是運行查詢時,資源名稱未解析爲entityType。相反,它會被賦予一個匿名實體類型,這意味着該列的類型必須從其值中推斷出來。在我的情況下,一個領先的'P'意味着它被輸入爲Time。但是當生成的url被服務器讀取時,它會嘗試將其轉換爲正確的類型。

//var query = breeze.EntityQuery.from("Todos"); //Ok 

//wrong case => entityType = Anonymous => column's type inferred from value 
var query = breeze.EntityQuery.from("todos"); //Error 

http://jsfiddle.net/rockresolve/C4A

微風離散事件: 這種微妙的錯誤是很難追查(並且可以通過其它字符串類型推論被升高)。 是否有可能讓EntityQuery在默認情況下期望resourceName是一個有效的entityType,並且只有在設置顯式參數時才允許匿名類型。

+0

嗯......這是一個有趣的想法,但我們儘可能不引入突破性改變。我想知道,如果這不是我們的文檔問題,或者應該將'expectEntityType()'方法添加到查詢中。 –

+0

突破不好。也許一個'fromEntityType'方法?但或許更好,如果資源名稱匹配不是特定的情況,因爲Ajax服務不是。這是通常會在無效的resourceName上引發錯誤的Ajax服務。 – RockResolve

+0

嗯,我們現在有了EntityQuery.toType()方法和/或MetadataStore.setEntityTypeForResourceName。 –

相關問題