这是使用BreezeJS和Breeze控制器到EF提供商。我有几个相关的实体,我们称之为客户,它有一个名为Orders的导航属性,链接到该客户的一组订单实体。
我想在UI上显示的是一组与部分名称搜索匹配的客户的订单计数摘要。我可以通过返回所有Order对象来做到这一点,但它们是非常大的对象,我真的不想在不需要时返回它们的100个。 inlineCount()方法似乎总是给出顶级实体(Customer)的计数而不是子实体的计数,无论我把它放在语句中的哪个位置。
var predicate = breeze.Predicate.create('displayName', 'contains', partialName);
return this.entityQuery.from('Customers')
.where(predicate)
.orderBy('displayName')
.using(this.manager)
.expand('Orders')
.execute();
文档建议你可以用某种方式链接扩展,但我还没有找到有效的语法。
理想情况下,我想在订单名称为0(不完整)的订单上通过属性应用订单的位置,然后只给我那些匹配订单的计数。即,返回所有客户实体,但每个客户实体具有匹配的订单计数(而不是整个订单对象列表和过滤客户端)。
如果有可能实现,请欣赏正确方向的任何指针。我目前的想法是,我必须在服务器端控制器上创建一个自定义方法并在那里完成工作,但在我对OData可以支持的内容做出假设之前,我想我会在这里查看一些确认。
答案 0 :(得分: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();