親と子 (1-*) エンティティ コレクション モデルからラベルに 2 つの値を表示するリストを取得しようとしています。
私は3つのエンティティを持っています:
- [顧客]: CustomerId、名前、住所、...
- [注文]: OrderId、OrderDate、EmployeeId、Total、...
- [ 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# です。
ヒント/リンクをいただければ幸いです。