Breeze查询以包括筛选的相关实体
我有一个有订单的用户。我想选择用户并展开Orders以仅包括Orders.valid==true。大概是这样的: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
// 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;
}