Breeze 查询以包含已过滤的相关实体
Breeze query to include filtered related entities
我有一个有订单的用户。我想 select 用户并扩展订单以仅包含 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],它公开了一个 Breeze EFContextProvider<>
,再次遵循将每个实体集合集公开为 IQueryable<>
的 TempHire 方法。在 OrderSet()
中,我尝试了以下代码:
return _efContext.Context.OrderSet.Where(o => o.valid);
然而,当直接向 UserSet()
发送查询时,breeze 似乎不会使用公开的 OrderSet()
方法来扩展用户的 Orders
属性。
我考虑过直接在 UserSet()
中扩展 Orders
属性 以始终包含有效订单(使用 Linq),但我并不总是希望 Orders
为 UserSet
的每个查询返回,我不确定 BreezeController 是否会删除这些不需要的包含。
是否有 better/different 方法来实现此客户端或服务器端,而不是简单地在每个实体集上使用单独的 where 子句对服务器进行多次调用?
也许我应该创建一个 UserOrderSet()
端点并在我需要具有有效订单的用户时直接调用它?想法?
我想通了!
我开始阅读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;
}
请注意,breeze 方法返回的是实体而不是 IQueryable<>。这是关键。此外,只需使用过滤条件执行 EF 查询即可将这些 'active' 订单正确附加到 User.Orders 集合 属性.
客户端站点我将直接调用此方法,不需要第二个查询来加载 'active' 订单。
我希望这对以后的人有所帮助。
顺便说一句,我使用 BreezeJS 的次数越多,我就越喜欢它。我向团队的出色工作致敬!
再次感谢,
麦克
我有一个有订单的用户。我想 select 用户并扩展订单以仅包含 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],它公开了一个 Breeze EFContextProvider<>
,再次遵循将每个实体集合集公开为 IQueryable<>
的 TempHire 方法。在 OrderSet()
中,我尝试了以下代码:
return _efContext.Context.OrderSet.Where(o => o.valid);
然而,当直接向 UserSet()
发送查询时,breeze 似乎不会使用公开的 OrderSet()
方法来扩展用户的 Orders
属性。
我考虑过直接在 UserSet()
中扩展 Orders
属性 以始终包含有效订单(使用 Linq),但我并不总是希望 Orders
为 UserSet
的每个查询返回,我不确定 BreezeController 是否会删除这些不需要的包含。
是否有 better/different 方法来实现此客户端或服务器端,而不是简单地在每个实体集上使用单独的 where 子句对服务器进行多次调用?
也许我应该创建一个 UserOrderSet()
端点并在我需要具有有效订单的用户时直接调用它?想法?
我想通了!
我开始阅读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;
}
请注意,breeze 方法返回的是实体而不是 IQueryable<>。这是关键。此外,只需使用过滤条件执行 EF 查询即可将这些 'active' 订单正确附加到 User.Orders 集合 属性.
客户端站点我将直接调用此方法,不需要第二个查询来加载 'active' 订单。
我希望这对以后的人有所帮助。
顺便说一句,我使用 BreezeJS 的次数越多,我就越喜欢它。我向团队的出色工作致敬!
再次感谢,
麦克