【问题标题】:Nested query/Navigation Property collection嵌套查询/导航属性集合
【发布时间】:2012-11-30 13:27:30
【问题描述】:

假设以下模型:(示例取自 Breeze DocCode)

public class Customer {

    public Guid CustomerID { get; internal set; }
    public ICollection<Order> Orders { get; set; }
}

public class SomeDetail{
    public string name{ get; set; }
}

public class Order {

    public int OrderID {get; set;}
    public Guid? CustomerID {get; set;}

    public SomeDetail detail {get; set;}
}

对单个导航属性的嵌套查询对我来说很清楚。如果导航属性是一个集合,怎么可能做到这一点?像这样的:

var query = EntityQuery.from("Customers")
                 .where("Orders.detail.name", "==", someName);

作为“文本”: 选择该客户拥有的任何订单的明细名称等于 someCondition 的所有客户?

我在这里遇到错误是因为

.where("Orders.detail.name, "=", someCondition)

由于收集而无法实现。 有没有一种简单的方法来检查这种情况,而不需要建立一个数量的集合和手动过滤?

这里非常感谢任何帮助。

【问题讨论】:

  • 是的......你还不能这样做。我假设您的意思是“给我每个客户的订单,其名称为'someName'”。这样的查询需要两个“Any”子句。今天的 OData 规范不支持这一点。我们正在努力。如果您只需要回答这个问题,我实际上有办法进行此查询。它涉及控制器上的自定义查询方法。您不能编写客户端过滤器或扩展。您所能做的就是传递诸如“someName”之类的参数。让我知道你是否想要那个。同时,我们的积压工作要求让这种事情变得更容易/可能。
  • 我也非常希望看到这种方式。这将有助于我简化事情。
  • 这还不是我想要的,我还没有准备好谈论它,但我将 queryTests.js 中的一个 DocCode 测试推送到 github,称为“Chai 的订单”。对应的NorthwindController 方法是OrdersForProduct。用它来获得灵感。我们会做得更好。

标签: breeze


【解决方案1】:

从 Breeze 1.4.6 开始,我们增加了对两个新查询运算符的支持:“any”和“all”

这意味着您的查询现在看起来像这样。

var query = EntityQuery.from("Customers")
   .where("Orders", "any", "detail.name", "==", someName);

见:http://www.breezejs.com/documentation/query-examples

【讨论】:

  • 在这种情况下,Query 不会只返回带有 Orders.Detail.name == somename 的客户,如果条件满足任何一个,它也会返回匹配以及其他条目对吗?
  • 此查询返回所有有任何订单的客户,其 'detail.name' 等于 {someName}。
  • 感谢杰伊的回复。我有另一个问题。当我如上所述查询时,我发现结果集中还有除“somename”之外的“detail.name”记录。表示满足和不满足的条件,在后一种情况下,Orders obj 为空。我们不能像在 sql 查询中连接一样过滤父类和子类吗?
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多