每周对使用情况数据进行分组

时间:2015-10-10 14:06:48

标签: c# linq

我正在尝试创建一个使用情况报告,我可以在其中绘制每个用户每周创建的文件数。我正在尝试将数据放入DataTable中,以便我可以在图表中使用它。我走的路是笨重的,我猜测在Linq有更优雅的方式。

File类具有OpenDate和LastModUser值。我想总结为每个用户创建一周的所有文件。在表格中,这看起来像这样:

文件#OpenDate LastModUser

1 1/1/2015 ASmith

2 1/2/2015 ASmith

3 1/2/2015 DJones

4 1/2/2015 CBanks

此查询的结果将返回:

周#ASmith DJones CBanks

1 2 1 1

2等等

这是我到目前为止所做的。

    public static DataTable GetFileCountByUserByClient(Int32 clientID, Int32 weeks)
    {
        using (EtaDataModelContainer12 etaDbContext = new EtaDataModelContainer12())
        {
            DataTable table = new DataTable();
            table.Columns.Add("week", typeof(Int32));

            // These are all the client's files
            List<File> files = etaDbContext.Files.Where(b => b.ClientClientId == clientID).ToList();

            // Get a list of all users
            List<string> users = files.GroupBy(b => b.LastModUser).Select(b =>b.Key).Distinct().ToList();
            for (int i = 1; i < users.Count(); i++)
            {
                // Create one column per user
                table.Columns.Add(users[i], typeof(string));
            }

            // Add rows to the table based on how many files created in a given week
            DateTime today = DateTime.Today;
            int filecount = 0;

            // Loop through the number of selected weeks (rows in DataTable) and populate sums
            for (int j = 0; j < weeks; j++)
            {
                // Look at each file and determine if it fits in the selected week
                foreach (File item in files)
                {
                    // If a match is found determine what column in the DataTable should be incremented
                }

                table.Rows.Add(j, filecount);

            }


            return table;

        }
    }

必须有一种更优雅的方式来做到这一点。

1 个答案:

答案 0 :(得分:0)

我认为,这可以解决您的问题。您可能需要调整一些常量以使其进入网格。此查询返回的一周将是从第0年开始的周数。

const long TicksPerWeek = TimeSpan.TicksPerDay * 7;

var userFiles = files.GroupBy(f => f.LastModUser);
var userStats = userFiles.Select(u =>
    u.GroupBy(f => file.Date.Ticks / TicksPerWeek)
        .Select(f => new { week = f.Key, modifiedCount = f.Count()))