【问题标题】:BreezeJS count of expanded entitiesBreezeJS 扩展实体的数量
【发布时间】:2016-02-16 17:46:52
【问题描述】:

这是通过 EF 提供程序使用 BreezeJS 和 Breeze 控制器。我有几个相关的实体,我们称它们为客户,它有一个名为 Orders 的导航属性,它链接到该客户的一组订单实体。

我希望在 UI 上显示与部分名称搜索匹配的一组客户的订单计数摘要。我可以通过返回所有 Order 对象来做到这一点,但它们是相当大的对象,我真的不想在不需要的时候返回 100 个。 inlineCount() 方法似乎总是给出顶级实体(客户)的计数,而不是子实体的计数,无论我将它放在语句中的什么位置。

var predicate = breeze.Predicate.create('displayName', 'contains', partialName);         
return this.entityQuery.from('Customers')
        .where(predicate)
        .orderBy('displayName')
        .using(this.manager)
        .expand('Orders')
        .execute();

文档建议您可以以某种方式链接扩展,但我还没有找到有效的语法。

理想情况下,我想通过 Order 上的一个名为 Status 的属性(例如 0(不完整))将 where 应用于 Orders,然后只给我那些匹配的 Orders 的计数。即,将所有客户实体返回给我,但每个实体都有一个匹配的订单计数(而不是整个订单对象列表和过滤客户端)。

如果可以实现,将不胜感激任何正确方向的指针。我目前的想法是,我必须在服务器端控制器上创建一个自定义方法并在那里完成工作,但在我对 OData 可以支持的内容做出假设之前,我想我会在这里检查以进行确认。

【问题讨论】:

  • 显然,一种选择是取回与第一个谓词匹配的所有客户,然后为所有具有匹配 customer.id 且状态为 0 的订单实体在客户端执行另一个查询。到目前为止,虽然有很多客户匹配该名称,但事实证明这很慢,所以寻找建议的选项

标签: breeze


【解决方案1】:

到目前为止,这是我最好的方法(如果有更好的方法,也许有人可以纠正我)。

在服务器上,添加这个方法:

  public IQueryable<object> CustomerSummaries()
  {
     return Context.Customers.Select(p => new
                                          {
                                             Customer = p,
                                             ActiveOrderCount = p.Orders.Count(o => o.Status == 1)
                                          });
  }

然后在客户端:

     var predicate = breeze.Predicate.create('customer.displayName', 'contains', partialName);

     return this.entityQuery.from('CustomerSummaries')
        .where(predicate)
        .using(this.manager)
        .execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多