按属性和时间间隔对数据进行分组

时间:2018-05-23 14:15:39

标签: javascript c# typescript

我的班级看起来像这样:

charArray

此类的目的是存储有关在我的Web应用程序中对表单执行更改的人员的信息。在表单上,​​您可以打开一个模式,显示这些更改及其发生的时间。

现在,问题在于表单具有自动保存功能,可以在每次更改后保存表单,这可以在很短的时间间隔内生成大量的日志帖子,因此看起来有点乱。当我打开模态来查看日志时,它通常看起来像这样:

public class UserAction
{
        public int LogId { get; set; }
        public string UserName { get; set; }
        public CrudAction Action { get; set; }
        public DateTime Date{ get; set; }
}

我正在寻找一种聪明的方法来以某种方式将同一个人在同一时间内生成的所有帖子分组,并且只显示最新的帖子。像这样:

User        User action  Date and time of action
Lisa        Edited       2018-05-20 09:46 AM GMT+2
Tom         Edited       2018-05-18 11:18 AM GMT+2
Tom         Edited       2018-05-18 11:18 AM GMT+2
Tom         Edited       2018-05-18 11:18 AM GMT+2
Tom         Edited       2018-05-18 11:16 AM GMT+2
Tom         Edited       2018-05-18 11:15 AM GMT+2
Tom         Edited       2018-05-18 11:15 AM GMT+2
Tom         Edited       2018-05-18 11:15 AM GMT+2
Tom         Edited       2018-05-18 10:12 AM GMT+2 
Lisa        Edited       2018-05-16 13.28 PM GMT+2
Lisa        Posted       2018-05-16 13.25 PM GMT+2

我的应用程序是一个有角度的5应用程序,我正在使用.Net Core Web API从SQL数据库获取数据。我想这个逻辑可以在角度应用程序或web api中,但也许更适合在客户端上执行此操作?

我已经尝试在javascript和LINQ中完成这项工作,但我没有走得太远(有些东西没有点击我的大脑)所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

如果您不想显示分组过滤掉的数据,最好过滤服务器端已有的数据。原因是否则您将不必要的数据传输到客户端,只需删除它们。这会降低您的应用速度。仅传输您需要的数据。

在Web API控制器中,您可以使用LINQ的强大功能。诀窍是引入一个实现您的要求的自定义IEqualityComparer<UserAction>,然后将其提供给Distinct方法。

UserAction[] userActions = dbContext.UserActions.ToArray();
var distinctActions = userActions
    .OrderByDescending(ua => ua.Date)             // sort as you like here
    .Distinct(new UserNameActionAndHourComparer());   // apply filter

public class UserNameActionAndHourComparer : IEqualityComparer<UserAction> {

    public bool Equals(UserAction left, UserAction right){
        if (left == null && right == null) {
             return true;
        }
        if (left == null | right == null) {
            return false;
        }

        // your equality criteria here ...
        if (left.UserName == right.UserName && left.Action == right.Action) {
            // implement requirement that same hour is considered equal
            return left.Date.Date == right.Date.Date && left.Date.Hour == right.Date.Hour;
        }
        return false;
   }

    // if two UserActions are considered equal, they should yield the same hashcode
    public int GetHashCode(UserAction ua) {
        return ua.UserName.GetHashCode() 
            ^ ua.Action.GetHashCode() 
            ^ new DateTime(ua.Date.Year, ua.Date.Month, ua.Date.Day, ua.Date.Hour, 0, 0).GetHashCode();
    }
}

C# Fiddle