我正在尝试创建一个使用情况报告,我可以在其中绘制每个用户每周创建的文件数。我正在尝试将数据放入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;
}
}
必须有一种更优雅的方式来做到这一点。
答案 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()))