各注文のステータス項目をすべて含むリストを取得しました。私が抱えている問題は、ステータス->ログ日付の組み合わせが最高ではないすべてのアイテムを削除する必要があることです。
例えば
var inputs = new List<StatusItem>();
//note that the 3th id is simply a modifier that adds that amount of secs
//to the current datetime, to make testing easier
inputs.Add(new StatusItem(123, 30, 1));
inputs.Add(new StatusItem(123, 40, 2));
inputs.Add(new StatusItem(123, 50, 3));
inputs.Add(new StatusItem(123, 40, 4));
inputs.Add(new StatusItem(123, 50, 5));
inputs.Add(new StatusItem(100, 20, 6));
inputs.Add(new StatusItem(100, 30, 7));
inputs.Add(new StatusItem(100, 20, 8));
inputs.Add(new StatusItem(100, 30, 9));
inputs.Add(new StatusItem(100, 40, 10));
inputs.Add(new StatusItem(100, 50, 11));
inputs.Add(new StatusItem(100, 40, 12));
var l = from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
;
編集:便宜上、クラス定義も追加します。
public class StatusItem
{
public int internalId;
public int statusId;
public DateTime date;
public StatusItem(int internalId, int statusId, int secMod)
{
this.internalId = internalId;
this.statusId = statusId;
date = DateTime.Now.AddSeconds(secMod);
}
}
これにより、次を返すリストが作成されます。
注文 123 ステータス 30 日付 2010
年 4 月 9 日 午後 6:44:21 注文 123 ステータス 40 日付 2010 年 4 月 9 日 午後 6:44:24
注文 123 ステータス 50 日付 2010 年 4 月 9 日 午後 6:44:25
注文 100 ステータス 20 日付 2010 年 4 月 9 日 6:44:28 PM
注文 100 ステータス 30 日付 2010 年 4 月 9 日 6:44:29 PM
注文 100 ステータス 40 日付 2010 年 4 月 9 日 6:44:32 PM
注文 100ステータス 50 日付 2010 年 4 月 9 日 18:44:31
これはほぼ正しいです。ただし、ステータス 50 の最後の行は、履歴リストでステータス 40 によって無効にされたため、除外する必要があります。U は、その日付がステータス 40 の「最後の」ステータス項目よりも低いという事実によってわかります。
立ち往生しているので、誰かが私にいくつかの指針を教えてくれることを望んでいました。
編集:最終的な完全な解決策:
var k = from sg in
from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
from s in sg
where s.date >= sg.Where(n => n.statusId <= s.statusId).Max(n => n.date)
group s by s.internalId
into si
from x in si
select x;