0

MVC3.0 で MySQL C# を使用して、同じテーブル内の現在のレコードと前のレコードを毎回比較する方法。

これは私のテーブルです

履歴表:

id  | projid|     task |   name         | description     |        date  |       type
----|-------|   -----  | -------------- |------------     |       -------|    ---------
1   |   1   |    sys21 |  validation    | validating user |      1-5-12  |    created
2   |   1   |    sys21 |  bug tracking  | background bug  |     23-7-12  |    updated
    |       |          |                |     tracking    |              |
3   |   1   |    sys21 |   bug tracking |  bug reporting  |    30-8-12   |   updated
4   |   1   |    sys21 |   bugs         |  bug reporting  |   12-9-12    |  updated
----------------------------------------------------------------------------------

前のレコードを前の履歴として表示し、前のレコードと比較して得られたレコードを表示するために、更新されたタイプのレコードを前のレコードと比較し、更新されたフィールドのみを現在の履歴として表示するような結果が必要です。

現在、projid に応じて履歴を取得しています。

そして私の見解は以下のようになります:

previous history             current history
----------------             ---------------
type:                        created
name:                        validation
description:                 validating user

--------------------------------------------------------------

type:           created                         updated
name            validation                      bug tracking
description:    validating user                 background bug tracking

--------------------------------------------------------------------
type:           updated                         updated
name:           bug tracking                    bug report    
description:    background bug tracking         bug reporting

----------------------------------------------------------------
type:            updated                        updated
name:            bug tracking                   -
Description:     background bug tracking        bug reporting

------------------------------------------------------------------------
type:            updated                        updated
name:            bug tracking                   bugs
Description:     bug reporting                  -

私は上記の出力を期待しています。誰か plz が状況から私を助けてくれます。

ありがとうございました、

4

1 に答える 1

0

私があなたを正しく理解したかどうかはわかりませんが、次のロジックでこれにアプローチできます。

  1. アイテムの履歴を表す行を取得し、日付の降順で並べ替えます
  2. 最後の変更として上から最初の行を取得します
  3. 前から最後の変更として、1. から 2 行目を取得します。
  4. データを比較する

これに対する潜在的なアプローチは次のとおりです(Linqを使用):

var history = db.History.Where(item => item.ProjId == 1)
                        .OrderByDescending(item => item.Date);
var lastChange = history.First();
var previousChange = history.Skip(1).First();

次に、上記の行を比較メソッドに送信する必要があります。変更を強調表示する場合は、行のプロパティを反復処理し、次のように同じプロパティの値を比較できます。

private IEnumerable<Tuple<string, object, object>> GetChangesBetweenRows(History row1, History row2)
{
    var result = new List<Tuple<string, object, object>>();
    var properties = lastChange.GetType().GetProperties(); // both rows are of the same type
    foreach(var propInfo in properties)
    {
        var obj1 = propInfo.GetValue(lastChange, null);
        var obj2 = propInfo.GetValue(previousChange, null);
        if(obj1 != obj2)
            result.Add(Tuple.Create(propInfo.Name, obj1, obj2));
    }
    return result;
}

編集 上記の方法を使用すると、履歴行のコレクションを反復処理して、コレクション内の 2 つの行のいずれかの違いを取得できます。

static void Main(string[] args)
{
    var history = db.History.Where(item => item.ProjId == 1)
                            .OrderBy(item => item.Date)
                            .ToArray();
    for(int i=1; i<history.Length; i++)
    {
        var diff = GetChangesBetweenRows(history[i-1], history[i]);
        DisplayDifferences(diff);
    }
}

static void DisplayDifferences(IEnumerable<Tuple<string, object, object>> diff)
{
    foreach(var tuple in diff)
    {
        Console.WriteLine("Property: {0}. Object1: {1}, Object2: {2}",tuple.Item1, tuple.Item2, tuple.Item3);
    }
}
于 2012-10-15T09:58:29.983 に答える