如何在Breeze JS中过滤子属性集合?

时间:2013-04-29 12:41:17

标签: breeze

我正在尝试根据子实体的集合过滤实体。这是我的实体(EF POCO):

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public string Description { get; set; }
}

使用Breeze js我想要返回任何Order.Description包含单词'foo'的所有客户。我想象查询看起来类似于:

query = entityQuery.from('Customers')
                   .where("Orders.Description", "contains", "foo");

但当然这不会奏效。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

从Breeze 1.4.6开始,Breeze现在支持“any”和“all”查询运算符。

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

这意味着此查询现在可以组成:

var query = breeze.EntityQuery.from("Customers")
  .where("Orders", "any", "Description", "contains", "Foo");

答案 1 :(得分:8)

微风是不可能的。我建议您在您的支持中实现一个方法,该方法返回任何Order.Description包含单词'foo'的所有客户。

如果您使用的是Web API,它将类似于:

query = entityQuery.from('getCustomerAnyOrderWithFooDescription');

在你的后端:

[HttpGet]
public IQueryable<Customer> getCustomerAnyOrderWithFooDescription()
{
  return _contextProvider.Context.Customers.Where(c.Orders.Any(o => o.Description.Contains('foo')));
}

你也可以这样做更通用的事情:

query = entityQuery.from('getCustomerAnyOrderWithDescription').withParameters('foo');

[HttpGet]
public IQueryable<Customer> getCustomerAnyOrderWithDescription([FromBody] String someText)
{
  return _contextProvider.Context.Customers
      .Where(c.Orders.Any(o => o.Description.Contains(someText)));
}