1

各注文のステータス項目をすべて含むリストを取得しました。私が抱えている問題は、ステータス->ログ日付の組み合わせが最高ではないすべてのアイテムを削除する必要があることです。

例えば

        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;
4

2 に答える 2

1

現在、日付に必要なフィルタリングを実行するものがないように見えるので、それについて何かをする必要があります.

ちなみに、次のようなものは追加のフィルタリングを実行します。

        var k = from sg in l
                from s in sg
                where s.date >= sg.Where(n => n.statusId <= s.statusId).Max(n => n.date)
                group s by s.internalId;

テストしていないため、グループ化は希望どおりではない可能性があり、比較は逆になる可能性がありますが、そのようなものはフィルタリングする必要があります。 代わりに、>=またはステータスが常にそれ自体と比較され、集計の問題で空のセットを処理する必要がないことを意味する必要があります。<=><

于 2010-04-09T19:55:45.303 に答える
0

あなたが持っているのとまったく同じ形式ではありませんが、正しい結果が得られます。i、j、k プロパティを持つステータス アイテム クラスを作成しました。あなたがそれらに使用した名前がわからない。

var keys = inputs.Select(
    input =>
        new { i = input.i, j = input.j })
.Distinct();

var maxes = keys.Select(
    ints =>
        inputs.First(
            input =>
                input.i == ints.i
             && input.j == ints.j
             && input.k == inputs.Where(
                               i =>
                                   i.i == ints.i
                                && i.j == ints.j
                            ).Select(i => i.k).Max()));
于 2010-04-09T18:20:04.070 に答える