0

親と子 (1-*) エンティティ コレクション モデルからラベルに 2 つの値を表示するリストを取得しようとしています。

私は3つのエンティティを持っています:

  1. [顧客]: CustomerId、名前、住所、...
  2. [注文]: OrderId、OrderDate、EmployeeId、Total、...
  3. [ OrderStatus ]: OrderStatusId、StatusLevel、StatusDate、...

Customerは MANY Orderを持つことができ、Order は MANY OrderStatusを持つことができます。つまり [ Customer ] 1--* [ Order ] 1--* [ OrderStatus ]

CustomerId を指定して、すべての注文 (OrderId のみ) とその注文の最新 (MAX?) の OrderStatus.StatusDate を取得したいと考えています。

私はいくつかの試みを試みましたが、私が望む結果を得ることができます。

private IQueryable<Customer> GetOrderData(string customerId)
{
     var ordersWithLatestStatusDate = Context.Customers

     // Note: I am not sure if I should add the .Expand() extension methods here for the other two entity collections since I want these queries to be as performant as possible and since I am projecting below (only need to display 2 fields for each record in the IQueryable<T>, but thinking I should now after some contemplation.

     .Where(x => x.CustomerId == SelectedCustomer.CustomerId)
     .Select(x => new Custom 
     {
         CustomerId = x.CustomerId,
         ...
         // I would like to project my Child and GrandChild Collections, i.e. Orders and OrderStatuses here but don't know how to do that. I learned that by projecting, one does not need to "Include/Expand" these extension methods.  
     });
     return ordersWithLatestStatusDate ;
}

---- 更新 1 ----

User: lazyberezovskyからの優れたソリューションの後、次のことを試しました。

var query = Context.Customers
            .Where(c => c.CustomerId == SelectedCustomer.CustomerId)
            .Select(o => new Customer 
            { 
                Name = c.Name, 
                LatestOrderDate = o.OrderStatus.Max(s => s.StatusDate) 
            });

最初の投稿から急いでいたため、すべてを正しく貼り付けることはできませんでした。これは、ほとんどがメモリからのものであり、その時点で参照用の正確なコードがなかったからです。私のメソッドは厳密に型指定された IQueryabled であり、そのパラメーターの 1 つとして IQueryable クエリを持つ厳格な API 内の制約のために、型 T のアイテムのコレクションを返す必要があります。拡張メソッド .Expand() および/または .Select() を使用して、他のエンティティ/属性を追加できることを認識しています。上記の最新の UPDATED クエリでは、以前は匿名だった .Select() 内に「新しい顧客」が追加されていることに気付くでしょう。サーバーレベルでLatestOrderDateがCustomerのプロパティではないため、有効なUriに変換できなかったため、クエリが失敗したのはそのためだと確信しています。ご参考までに、以下の最初の回答を見て、単純な { get; でそのプロパティをクライアント側の Customer クラスに追加しました。設定; }。これを考えると、2 つの異なるエンティティから 2 つのフィールドを戻すだけで Customer コレクションを保持できますか? 以下のソリューションは、非常に有望で独創的です。

---- 更新 1 終了 ----

参考までに、私が使用しているテクノロジは、OData (WCF)、Silverlight、C# です。

ヒント/リンクをいただければ幸いです。

4

2 に答える 2

2

{ OrderId, LatestDate }これにより、オブジェクトのリストが表示されます

var query = Context.Customers
                   .Where(c => c.CustomerId == SelectedCustomer.CustomerId)
                   .SelectMany(c => c.Orders)
                   .Select(o => new { 
                              OrderId = o.OrderId, 
                              LatestDate = o.Statuses.Max(s => s.StatusDate) });

               .

メモリ内のUPDATEコンストラクト オブジェクト

var query = Context.Customers
                   .Where(c => c.CustomerId == SelectedCustomer.CustomerId)
                   .SelectMany(c => c.Orders)
                   .AsEnumerable() // goes in-memory
                   .Select(o => new { 
                              OrderId = o.OrderId, 
                              LatestDate = o.Statuses.Max(s => s.StatusDate) });

ここでもグループ化が役立ちます。

于 2012-11-07T11:31:09.270 に答える
0

これを正しく読むと、Customer エンティティと、その Orders プロパティから計算された単一の値が必要になります。現在、これは OData ではサポートされていません。OData は、クエリで計算された値をサポートしていません。したがって、プロジェクションに式はなく、集計もありません。

残念ながら、2 つのクエリを使用しても、OData は MAX 機能を表現する方法をサポートしていないため、現在のところこれは不可能です。

サービスを制御できる場合は、サーバー側の関数/サービス操作を記述して、この種のクエリを実行できます。

于 2012-11-08T09:34:20.413 に答える