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                  -

我期待上述输出,任何人请帮助我摆脱这种情况,任何国王都将被接受......

谢谢,

4

1 回答 1

0

我不确定我是否正确理解了您,但您可以使用以下逻辑来解决此问题:

  1. 获取表示项目历史记录的行并按日期降序排列
  2. 从上面获取第一行作为最后一次更改
  3. 从 1 中获取第二行。作为上一个到最后一个更改
  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;
}

编辑 给定上述方法,您可以遍历历史记录行的集合并获取集合中任何两行之间的差异:

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 回答