【问题标题】:Breeze query to include filtered related entities微风查询以包括过滤的相关实体
【发布时间】:2017-11-29 15:42:02
【问题描述】:

我有一个有订单的用户。我想选择用户并展开订单以仅包含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 Repository 并稍作修改:

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);

上述查询不起作用,因为 where 条件不能应用于作为集合的实体属性。

为了在客户端解决这个问题,我简单地实现了两个查询,一个获取用户,另一个获取用户的有效订单。我更愿意将其设为单个查询。

我也尝试在服务器端解决这个问题。我正在使用 [BreezeController] 公开一个微风EFContextProvider&lt;&gt;,然后再次将每个实体集合集公开为IQueryable&lt;&gt; 的 TempHire 方法。在OrderSet() 中我尝试了以下代码:

return _efContext.Context.OrderSet.Where(o => o.valid);

然而,当查询直接发送到UserSet()时,微风似乎不会使用暴露的OrderSet()方法来扩展用户的Orders属性。

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

有没有更好/不同的方法来实现这个客户端或服务器端,而不是简单地使用每个实体集上的单独 where 子句对服务器进行多次调用?

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

【问题讨论】:

  • 我不认为这可以在一个查询中完成。我尝试通过 Linq 直接在服务器端执行此操作,并使用子查询手动填充订单,但随后将失败,并显示“无法在 LINQ to Entities 查询中构造实体或复杂类型'Model.User'”

标签: breeze


【解决方案1】:

我想通了!

我开始阅读http://briannoyesblog.azurewebsites.net/2014/02/13/passing-complex-query-parameters-with-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;
    }

注意,微风方法返回的是实体而不是 IQueryable。这是关键。此外,只需使用过滤条件执行 EF 查询,即可将这些“活动”订单正确附加到 User.Orders 集合属性。

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

我希望这对将来的人有所帮助。

顺便说一句,我使用 BreezeJS 的次数越多,我就越喜欢它。我要感谢团队出色的工作!

再次感谢,

迈克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多