2014-12-30 23 views
1

我想弄清楚如何用單個請求擴展實體數組中所有項目的特定導航屬性。微風 - 獲取所有實體數組的導航屬性

在微風文檔this page它顯示了實現這一目標的方式如下:

var orderEntityType = selectedOrders[0].entityType; 
var navProp = orderEntityType.getNavigationProperty("OrderDetails"); 
var navQuery = EntityQuery 
    .fromEntityNavigation(selectedOrders, navProp) 
    .expand("Product"); 
manager.executeQuery(navQuery).fail(handleFail); 

然而,當我嘗試這樣做,我得到了錯誤

的「實體」參數必須是實體

所以I looked up in the documentation專門針對EntityQuery.fromEntityNavigation方法,它顯示:

// 'employee' is a previously queried employee 
var ordersNavProp = employee.entityType.getProperty("Orders"); 
var query = EntityQuery.fromEntityNavigation(employee, ordersNavProp); 

文檔指示它是一個特定的實體,而不是多個。這與我得到的錯誤一致。

是否有可能在單個請求中獲取所有導航屬性,或者是對每個實體發出請求的數組迭代的首選方式?

基本上,我正在過濾項目列表。我的目標是,當用戶選擇過濾器時,它會在當時擴展所需的導航屬性,而不是預先加載所有數據。

感謝您的幫助。

回答

2

我認爲這可能是一個錯字或navigation properties documentation page的一些過時的信息。根據API documentationEntityQuery.fromEntityNavigation,第一個參數應該是單個實體,而不是數組。看了一下微風代碼,沒有看到任何證據表明可以傳遞一組實體。

作爲一種解決方法,您可以構建查詢有點不同。如果你能直接查詢訂單詳情,你甚至都不需要擴大

var subsetOfOrders = ..., // array containing the subset of orders whose OrderDetails we need to load 
    predicates = subsetOfOrders.map(function(order) { return new breeze.Predicate('OrderId', '==', order.OrderId()); }), 
    predicate = breeze.Predicate.or(predicates), 
    query = new breeze.EntityQuery('Orders').expand('OrderDetails').where(predicate); 

manager.executeQuery(query)... 

:與訂單/訂單明細情況繼續,你可以做這樣的事情。微風將電纜鋪設新加載的訂單明細到在實體管理器已經緩存在各階的實體:

var subsetOfOrders = ..., // array containing the subset of orders whose OrderDetails we need to load 
    predicates = subsetOfOrders.map(function(order) { return new breeze.Predicate('OrderId', '==', order.OrderId()); }), 
    predicate = breeze.Predicate.or(predicates), 
    query = new breeze.EntityQuery('OrderDetails').where(predicate); 

manager.executeQuery(query)... 

該斷言基於解決辦法可能會或可能不會取決於你正在處理的訂單數是可行的。最終可能會有一個很長的查詢字符串。然後,您可以考慮使用一個專用控制器動作(即「OrderDetailsByOrderId(INT [] orderIds)」,並使用withParameters EntityQuery方法使用新的動作載入訂單詳細信息。

+0

非常感謝您的幫助,我只是直接查詢導航屬性,就像您所說的那樣,Breeze處理所有事情。它只是工作。得愛! – Jef

+0

對於我可能需要負責的錯誤文檔,我表示歉意。我無法更改代碼,但我可以修復文檔...並且很快就會完成。 – Ward

+0

你們已經把令人驚歎的優秀文檔數量放在一起,這使得輕鬆愉快的工作。我們謝謝你。 –

2

documentation是錯誤的。我只是修正它

@Jeremy Danyow提供了一個極好的解釋和解決辦法。我可能會用自己的方法來解決具體的使用情況。

文檔現在討論的問題,並介紹了另一種方法可能會更如果你正在嘗試編寫一個通用工具,那就適當了。

// create an array of filter criteria (`wherePredicate`) for each order 
var predicates = orders.map(function (order) { 
    return EntityQuery.fromEntityNavigation(order,'OrderDetails') 
         .wherePredicate; 
}); 

// OR the predicates together 
var filter = breeze.Predicate.or(predicates); 

EntityQuery.from('OrderDetails') 
    .where(filter) 
    .expand('Product') 
    .using(em).execute().catch(handleFail); 

感謝您對問題的識別和解決。