2012-11-30 161 views
1

假设以下型号:(例如,从微风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) 

是不可能的,因为集合。 有没有一个简短的方法来检查这种情况,而不是建立一个数字收集和过滤每手?

任何帮助在这里大大赞赏。

+0

是......你不能这样做呢。我假设你的意思是“给我每个有订单的客户,其名称是'someName'”。这样的查询将需要两个“任何”条款。今天的OData规范不支持。我们正在努力。如果你只需要回答这个问题,我实际上有办法做这个查询。它涉及控制器上的自定义查询方法。您无法编写客户端过滤器或展开。你所能做的只是传递诸如'someName'之类的参数。让我知道你是否想要。同时,我们的积压项目有要求让这种事情变得更容易/可能。 – Ward

+0

我非常想看到这种方式。这将帮助我很多来简化事情。 –

+2

这不是我想要它的地方,我还没有准备好谈论它,但我推荐给github一个名为“Chai的订单”的queryTests.js中的DocCode测试。相应的'NorthwindController'方法是'OrdersForProduct'。用它来获得灵感。我们会做得更好。 – Ward

回答

1

随着微风1.4.6,我们添加了两个新的查询运营商的支持:“任何”和“全部”

这意味着你的查询现在可以是这个样子。

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

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

+0

在这种情况下,Query不会仅返回Orders.Detail.name == somename的客户,如果条件满足任何一个,它将返回匹配以及其他条目也是正确的? –

+0

此查询将返回具有等于{someName}的'detail.name'的任何订单的所有客户。 –

+0

感谢Jay的回复。我有另一个问题。当我查询上面的内容时,我发现,除了“somename”之外,结果集中还有'detail.name'的记录。意味着满足以及不满足的条件,并且在后一种情况下,订单obj为空。不能过滤父类和子类,因为我们在SQL查询中进行连接? –