2017-11-29 9 views
0

私はOrdersを持つUserを持っています。ユーザーを選択して注文を展開して、Orders.valid == trueのみを含めたいとします。このような何か:where()方法が少しTempHireリポジトリから取得され、修正されフィルタリングされた関連エンティティを含めるためのBreezeクエリ

// This is just a pseudo-query of what I want to achieve  
// Note singluar 'Order.valid' also does not work 
let query= new Predicate('guid', 'eq', this.user.guid).and(new Predicate('Orders.valid', 'eq', 'true');\ 
let users= this.uow.userSet.where(query, ['Orders']); 

where(predicate: Predicate, expand: string[] = null): Promise<any[] | Entity[]> { 
    return new Promise<any[] | Entity[]>((resolve) => { 
     let query = this.baseQuery().where(predicate) 
     if(expand) query = query.expand(expand); 

は、上記のクエリのように動作しない条件は、エンティティのプロパティに適用することができませんコレクションです。

これをクライアント側で解決するために、私は単純に2つのクエリを実装しました.1つはユーザーをフェッチし、もう1つはユーザーの有効な注文をフェッチします。私はこれを単一のクエリにすることを好むでしょう。

また、サーバー側でこれを解決しようとしました。私は、Breeze EFContextProvider<>を公開している[BreezeController]を使用して、として各エンティティコレクションセットを公開するTempHireメソッドを再び使用しています。クエリがUserSet()に直接送信されたときに風がユーザーのOrdersプロパティを展開するためにさらさOrderSet()メソッドを使用することは思えないしかし

return _efContext.Context.OrderSet.Where(o => o.valid); 

OrderSet()の中で私は、次のコードを試してみました。

私はいつも(のLINQを使用して)、有効な注文を含めるようにUserSet()内で直接Ordersプロパティを拡大について考え、私はいつもOrdersUserSetに、すべてのクエリに対して返され、私はBreezeControllerは、これらを除去するかどうかはわからないしたくありません不要です。

各エンティティセットの個々のwhere句を使用してサーバーに複数の呼び出しを行うのではなく、クライアント側またはサーバー側を実装する方が良い/異なる方法がありますか?

おそらく、UserOrderSet()エンドポイントを作成し、有効な注文のあるユーザーを希望するときに直接呼び出す必要がありますか?思考?

+0

私はこれがすべて1つのクエリで行うことができるとは思いません。私はそれをサーバー側でLinqと投影を介して直接手作業でサブクエリを作成しようとしましたが、 "エンティティまたは複合型 'Model.User'をLINQ to Entitiesクエリで構築できません" – Mike

答えて

0

私はそれを理解しました!

私はこれは私が取得したいエンティティのパラメータを受け入れそよ風クエリを作成するために私を導いhttp://briannoyesblog.azurewebsites.net/2014/02/13/passing-complex-query-parameters-with-breeze/

を読み始めた:そよ風の方法はのIQueryableエンティティない返却され

[HttpGet] 
    [EnableBreezeQuery] 
    public User UserOderSet(Guid guid) 
    {       
     User user = _efContext.Context.UserSet.Where(u => u.guid == guid).Single(); 
     List<Order> orders = _efContext.Context.OrderSet.Where(o => o.user_guid == guid && o.active).ToList(); 

     return user; 
    } 

注意を<>。これが鍵だった。また、フィルタ条件を使用してEFクエリを実行するだけで、これらの「アクティブな」OrdersをUser.Ordersコレクションプロパティに適切に付加できます。

クライアントサイトこのメソッドを直接呼び出すだけで、「アクティブな」オーダーを読み込むための2番目のクエリは必要ありません。

これは将来誰かに役立つことを願っています。

私がBreezeJSを使用するほど、私は絶対にそれを愛しています。私の帽子は彼らの優れた仕事のためにチームを離れています!

おかげで再び、

マイク

関連する問題