Breeze - 使用来自客户端的多个参数编写复杂查询

时间:2014-05-07 12:42:18

标签: sql entity-framework breeze

我正在尝试为Northwind数据库编写一个Breeze查询,以显示包含用户指定的所有三种产品的订单。因此,如果用户从下拉列表中选择ProductID 41,51和65,则查询将返回订单ID 10250。

这只是一个示例场景,我希望在我正在处理的项目中建立另一个查询,但我想使用Northwind来解释它比描述项目更容易。我可以使用派生表在T-SQL中轻松完成,但我需要从客户端获取参数。有什么想法吗?提前谢谢!

3 个答案:

答案 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)