0

の最新の記録は私が現在のLINQ:ダイナミック各グループ

マイモデル

public class Orders 
{ 
    public int OrderId ; 
    public ICollection<OrderStatuses> Statuses; 
} 

public class Statuses 
{ 
    public int StatusId; 
    public int OrderId; 
    public string Note; 
    public DateTime Created; 
} 

私のサンプル・データ以下の動的LINQの式に問題がネストされたサブクエリ内の句をゲット:

Orders 
| ID | Name  | 
---------------------- 
| 1 | Order 01 | 
| 2 | Order 02 | 
| 3 | Order 03 | 

Statuses 
|ID | OrderId | Note  | Created | 
--------------------------------------- 
| 1 | 1  | Ordered | 2016-03-01| 
| 2 | 1  | Pending | 2016-04-02| 
| 3 | 1  | Completed | 2016-05-19| 
| 4 | 1  | Ordered | 2015-05-19| 
| 5 | 2  | Ordered | 2016-05-20| 
| 6 | 2  | Completed | 2016-05-19| 
| 7 | 3  | Completed | 2016-05-19| 

私はノートの価値がと等しい数の注文を受け取りたいと思います。最大作成時間。この場合、この動的LINQの式を解決する方法を私に勧めてください以下 は、ここに私のアイデア私は、クエリ

| Name  | Note | Last Created| 
-------------------------------------| 
| Order 01 | Ordered | 2016-03-01 | 
| Order 02 | Ordered | 2016-05-20 | 

から期待注文のサンプル数であるが、それは間違った方法に

var outer = PredicateBuilder.True<Order>(); 

var orders = _entities.Orders 
         .GroupBy(x => x.OrderId) 
         .Select(x => new { x.Key, Created = x.Max(g => g.Created) }) 
         .ToArray(); 

var predicateStatuses = PredicateBuilder.False<Status>(); 

foreach (var item in orders) 
{ 
    predicateStatuses = predicateStatuses.Or(x => x.OrderId == item.Key && x.Created == item.Created); 
} 
var predicateOrders = PredicateBuilder.False<JobOrder>(); 

predicateOrders = predicateOrders.Or(predicateStatuses); (I don't how to passed expression which different object type (Order and Status) here or I have to write an extension method or something 

outer = outer.And(predicateOrders); 

を思えています。 ありがとうございます。

答えて

1

少なくとも、クエリには動的なものはありません。少なくとも、そうである必要はありません。通常のクエリとして表現できます。

var query = 
    from o in db.Orders 
    join s in db.Statuses on o.Id equals s.OrderId 
    where s.Note == "Ordered" 
    orderby s.Created descending 
    group new { o.Name, s.Note, LastCreated = s.Created } by o.Id into g 
    select g.First(); 

p.s.のように、あなたのモデルはまったくデータと一致していないようですので、私はそれを無視しています。必要に応じて調整します。

+0

本当にありがとうございましたが、私はnameプロパティを忘れてしまったと私はまさに私の問題デモ用のサンプルモデルを作成しました。私のコードでは、私はすでに動的なLinqを実装していますので、私はまだ動的なLinqのソリューションを探しています – nvtthang

+0

見つけましたhttp://stackoverflow.com/questions/418609/how-to-do-subquery-in-linq reference my質問 – nvtthang

0

ありがとうございます@ジェフメルカード答えです。最後に、私は下の私の問題を解決するためにあなたの答えをカスタマイズした:

あなたの答え.Actuallyため
var predicateStatuses = PredicateBuilder.False<Order>(); 
predicateStatuses = predicateStatuses.Or(p => (
             from j in db.Statuses 
             where j.OrderId == p.ID 
             group j by j.OrderId into g 
             select g.OrderByDescending(t=>t.Created) 
             .FirstOrDefault() 
            ).FirstOrDefault().Note == 'Ordered' 
           );