Breeze - 获取实体数组的所有导航属性

时间:2014-12-30 15:54:12

标签: javascript breeze

我试图找出Breeze如何使用单个请求为实体数组中的所有项目扩展特定的导航属性。

在Breeze文档的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 个答案:

答案 0 :(得分:2)

我认为这可能是关于navigation properties documentation page的错字或一些过时的信息。根据{{​​1}}的{​​{3}},第一个参数应该是单个实体,而不是数组。看看微风代码,没有看到任何证据表明可以传递一系列实体。

作为一种解决方法,您可以稍微改变一下构造查询。继续Order / OrderDetails方案,您可以执行以下操作:

EntityQuery.fromEntityNavigation

如果您能够直接查询订单详情,则甚至不需要展开。 Breeze会将刚刚加载的OrderDetails连接到已经在实体管理器中缓存的相应订单实体:

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)...

根据您处理的订单数量,这种基于谓词的解决方法可能也可能不可行。最终可能会有一个长查询字符串。然后,您可以考虑使用专用控制器操作(即" OrderDetailsByOrderId(int [] orderIds)"并使用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)... EntityQuery方法使用新操作加载订单详细信息。

答案 1 :(得分: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);

感谢您和我们一起确定问题并解决问题。