2013-04-29 61 views
5

我想基於子實體的集合來過濾實體。這裏是我的實體(EF POCO的):如何篩選Breeze JS中的子資產集合?

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; } 
} 

使用微風JS我想回到這裏任何Order.Description包含單詞「富」的所有客戶。我想象中的查詢類似於此:

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

當然是行不通的,但。有任何想法嗎?

+0

微風現在支持這樣的場景:http://www.breezejs.com/documentation/query-examples#凡在相關屬性條款 – robasta 2013-10-15 07:35:39

回答

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))); 
} 
+0

第二個解決方案完美的作品,謝謝! – mortware 2013-04-29 13:02:38

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"); 
+0

每當我嘗試這個語法,我得到以下錯誤: 「TypeError:a is undefined」 – 2014-04-20 05:07:25

+0

我不能讓它工作。任何人都有好運氣? – newman 2014-07-31 03:45:12

+0

是的,我得到它與OData後端正常工作。這應該是現在接受的答案,因爲現在的答案已經過時。 – 2014-11-07 09:13:25