我正在尝试为Northwind数据库编写一个Breeze查询,以显示包含用户指定的所有三种产品的订单。因此,如果用户从下拉列表中选择ProductID 41,51和65,则查询将返回订单ID 10250。
这只是一个示例场景,我希望在我正在处理的项目中建立另一个查询,但我想使用Northwind来解释它比描述项目更容易。我可以使用派生表在T-SQL中轻松完成,但我需要从客户端获取参数。有什么想法吗?提前谢谢!
答案 0 :(得分:1)
如果您仍然对在客户端上执行此操作感兴趣,可以尝试以下Breeze查询。
var listOfProductIds = [41, 51, 65];
var preds = listOfProductIds.map(function (id) {
return Predicate.create("OrderDetails", "any", "ProductID", "==", id);
});
var whereClause = Predicate.and(preds);
var query = EntityQuery.from('Orders').where(whereClause);
这将检索至少指定了所有3个产品的所有订单。
要进一步过滤此项,以便您拥有仅指定所有3个产品的所有订单,您可以写信,
entityManager.executeQuery(query)
.then(filterOrders);
//once you get results on the client
function filterOrders(data) {
var allOrders = data.results;
var filteredOrders = allOrders.filter(function (o) {
return o.OrderDetails.length == listOfProductIds.length;
});
}
您只能在客户端上进行过滤,因为OData还不支持像Linq to Entities那样的聚合计数功能。这可能并不理想,但如果您决定不在服务器上执行此操作,则可以选择它。
答案 1 :(得分:0)
对不起,我在评论中说过看and()
方法,但实际上您需要查看or()
方法 -
var p1 = breeze.Predicate("Product.ProductID", "==", 41);
var p2 = breeze.Predicate("Product.ProductID", "==", 51);
var p3 = breeze.Predicate("Product.ProductID", "==", 65);
var newPred = breeze.Predicate.or(p1, p2, p3);
var query = EntityQuery.from('Order_Details').select('Order.OrderID').where(newPred);
客户端上这些查询的唯一问题是,根据您在客户端构建它们的方式以及添加的谓词数量,在某些情况下,它们可以非常长,例如{ {1}}输入可以在IE8上咬你的查询。
答案 2 :(得分:0)
您可以使用EntityQuery.withParameters方法调用具有linq查询的服务器端查询。就是这样的事。
// On the client
var query = EntityQuery.from("GetOrdersWithProductIds")
.withParameters({ productIds: [41, 51, 65] });
// On the server
[HttpGet]
public IQueryable<Order> GetOrdersWithProductIds([FromUri] int[] productIds) {
return ContextProvider.Context.Orders.Where(... your linq query here ...);
}
或者您可以尝试使用支持&#39;任何&#39;所有&#39;查询运算符。就是这样的事。
var predicate = breeze.Predicate("ProductID", "==", 41)
.or("ProductID", "==", 51)
.or("ProductID", "==", 65);
var query = EntityQuery.from("Orders")
.where("OrderDetails", "all", predicate)