我现在有点为难,我是一个喜欢C#/.NET核心的学生,也喜欢用它来做我的爱好项目。但是我很难找到解决我当前问题的方法,我也不知道如何解决它。
在。NET Core中,我想在我的motorsport数据库中显示关于赛车手的前10个统计数据。更精确地说,我有一个关系数据库,其中有一个名为“driverresults”的表,它保存所有车手的所有比赛结果,“driverresults”保存“seasondriver”的外键,“seasondriver”是一个包含特定赛季车手信息的表,最后“seasondriver”包含“driver”表的外键,“driver”表包含车手是谁。例如,我想用某一位车手赢得比赛的频率来做一个排行榜。
leaderlistsModel是页面的ViewModel,包含5个列表,每个列表包含一个驱动程序对象和一个用于计算的统计信息的int。为了获取这些领导列表,领导列表的控制器调用一个方法来获取这些领导列表,方法如下所示:LeaderlistsModel leaderlistsModel = new LeaderlistsModel();
var drivers = DataContext.DriverResults
.IgnoreQueryFilters()
.Where(dr => dr.Race.Season.Championship.ActiveChampionship)
.GroupBy(sd => sd.SeasonDriver.Driver);
我不知道如何在一个LINQ查询中解决这个问题,所以为了填充LeaderlistsModel中的这5个列表中的每一个,我对var驱动程序进行了不同的调用,因此我们得到了这5个查询:leaderlistsModel.LeaderlistWins = drivers
.Select(dr => new LeaderlistWin
{
Driver = dr.Key,
WinCount = dr.Sum(s => s.Position == 1 ? 1 : 0),
})
.OrderByDescending(dr => dr.WinCount)
.Take(10);
leaderlistsModel.LeaderlistPodiums = drivers
.Select(dr => new LeaderlistPodium
{
Driver = dr.Key,
PodiumCount = dr.Sum(s => s.Position <= 3 ? 1 : 0),
})
.OrderByDescending(dr => dr.PodiumCount)
.Take(10);
leaderlistsModel.LeaderlistStarts = drivers
.Select(dr => new LeaderlistStart
{
Driver = dr.Key,
StartCount = dr.Count(),
})
.OrderByDescending(dr => dr.StartCount)
.Take(10);
leaderlistsModel.LeaderlistNonFinishes = drivers
.Select(dr => new LeaderlistNonFinish
{
Driver = dr.Key,
NonFinishCount = dr.Sum(s => s.Status == Status.DNF || s.Status == Status.DSQ ? 1 : 0),
})
.OrderByDescending(dr => dr.NonFinishCount)
.Take(10);
leaderlistsModel.LeaderlistPoles = drivers
.Select(dr => new LeaderlistPole
{
Driver = dr.Key,
PoleCount = dr.Sum(s => s.Grid == 1 ? 1 : 0),
})
.OrderByDescending(dr => dr.PoleCount)
.Take(10);
每个查询需要23秒才能完成,因此整个页面需要大约150秒才能加载,对于只需要5个简单的领导列表的内容来说,这是非常长的。
所以我的问题是,我怎样才能计算并得到驱动结果的统计数据,但如果没有它,加载的时间会非常长?
为了进一步的参考,我最终想要显示的页面如下所示。
谢谢你阅读这篇文章,我希望你能帮助我!