Breeze查询以包括筛选的相关实体

Breeze查询以包括筛选的相关实体,breeze,Breeze,我有一个有订单的用户。我想选择用户并展开Orders以仅包括Orders.valid==true。大概是这样的: // This is just a pseudo-query of what I want to achieve // Note singluar 'Order.valid' also does not work let query= new Predicate('guid', 'eq', this.user.guid).and(new Predicate('Orders.v

我有一个有订单的用户。我想选择用户并展开Orders以仅包括Orders.valid==true。大概是这样的:

// This is just a pseudo-query of what I want to achieve    
// Note singluar 'Order.valid' also does not work
let query= new Predicate('guid', 'eq', this.user.guid).and(new Predicate('Orders.valid', 'eq', 'true');\
let users= this.uow.userSet.where(query, ['Orders']);
where方法取自TempHire存储库并稍作修改:

where(predicate: Predicate, expand: string[] = null): Promise<any[] | Entity[]> {
    return new Promise<any[] | Entity[]>((resolve) => {
        let query = this.baseQuery().where(predicate)
        if(expand) query = query.expand(expand);
但是,当查询直接发送到用户集时,breeze似乎不会使用公开的OrderSet方法来扩展用户的Orders属性

我曾考虑直接在用户集中扩展Orders属性,以便使用Linq始终包含有效的订单,但我并不总是希望每个查询都返回到用户集的订单,而且我不确定BreezeController是否会删除这些不需要的包含

是否有更好/不同的方法来实现这一点(无论是客户端还是服务器端),而不是简单地使用每个实体集上的单独where子句对服务器进行多次调用

也许我应该创建一个UserOrderSet端点,并在需要具有有效订单的用户时直接调用它?想法?

我想出来了

我开始阅读

这引导我创建了一个breeze查询,该查询接受我要检索的实体的参数:

    [HttpGet]
    [EnableBreezeQuery]
    public User UserOderSet(Guid guid)
    {                        
        User user = _efContext.Context.UserSet.Where(u => u.guid == guid).Single();
        List<Order> orders = _efContext.Context.OrderSet.Where(o => o.user_guid == guid && o.active).ToList();

        return user;
    }
请注意,breeze方法返回的是一个实体,而不是IQueryable。这是关键。此外,只需使用筛选条件执行EF查询,即可将这些“活动”订单正确地附加到User.Orders集合属性

客户端站点我将直接调用此方法,而不需要第二次查询来加载“活动”订单

我希望这对将来有帮助

顺便说一句,我使用BreezeJS越多,我就越喜欢它。我为他们出色的工作向他们致敬

再次感谢


迈克

我认为这不可能在一个查询中完成。我试图通过Linq和投影直接在服务器端使用子查询手动填充订单,但在实体或复杂类型的“Model.User”查询中无法在Linq到实体查询中构造
    [HttpGet]
    [EnableBreezeQuery]
    public User UserOderSet(Guid guid)
    {                        
        User user = _efContext.Context.UserSet.Where(u => u.guid == guid).Single();
        List<Order> orders = _efContext.Context.OrderSet.Where(o => o.user_guid == guid && o.active).ToList();

        return user;
    }