2013-04-29 11 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は、単語「foo」を含んでいるすべての顧客を返すようにしたいです。私はこのようなクエリを想像しました:

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

もちろん、それは動作しません。何か案は?

+0

ブリーズは今、このシナリオをサポートしています:http://www.breezejs.com/documentation/query-examples# http://www.breezejs.com/documentation/query-examples

これは、このクエリは、今のように構成することができることを意味し関連するプロパティの節は – robasta

答えて

8

ブリーズではできません。どのようなOrder.Descriptionにも 'foo'という単語が含まれているすべての顧客を返すメソッドを実装することをお勧めします。

あなたがウェブ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

12

Breeze 1.4.6以降、Breezeは "any"および "all"クエリ演算子をサポートするようになりました。

参照:

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

この構文を試すと、次のエラーが発生します。 "TypeError:aは未定義です" –

+0

私はそれを動作させることはできません。誰もが幸運を持っていた? – newman

+0

ええ、ODataバックエンドでうまく動作するようにしました。これは、現在のものが期限切れであるため、現在受け入れられている回答でなければなりません。 –

関連する問題