如何在列表中添加和合并共享用户名的行

本文关键字:用户 共享 合并 列表 添加 | 更新日期: 2023-09-27 18:17:24

我的项目是一个游戏,用户尝试预测足球比赛的分数,并根据不同的标准获得分数。我使用MVC和实体框架。

我正在尝试创建一个排行榜,显示每个用户的总得分。我已经达到了某一点,但我不知道下一步该怎么做。

目前,我让排行榜在razor视图中使用foreach循环向用户显示每个预测。

视图:

@foreach (var item in Model)
{
    <tr>
        <td>@Html.DisplayFor(modelItem => item.AspNetUser.UserName)</td>
        <td>@Html.DisplayFor(modelItem => item.PredCorrectScore)</td>
        <td>@Html.DisplayFor(modelItem => item.PredCorrectResult)</td>
        <td>@Html.DisplayFor(modelItem => item.Less15Goals)</td>
        <td>@Html.DisplayFor(modelItem => item.Greater15Goals)</td>
        <td>@Html.DisplayFor(modelItem => item.Less25Goals)</td>
        <td>@Html.DisplayFor(modelItem => item.Greater25Goals)</td>
        <td>@Html.DisplayFor(modelItem => item.Greater35Goals)</td>
        @{
            var totals = (item.PredCorrectScore + item.PredCorrectResult + item.Less15Goals + item.Greater15Goals + item.Less25Goals + item.Greater25Goals + item.Greater35Goals);
        }
        <td>@totals</td>
    </tr>
}

控制器:

var predictions = db.Predictions
    .Include(p => p.AspNetUser)
    .Include(p => p.Prediction1)
    .Include(p => p.Match)
    .ToList();
return View(predictions);

当前将用户所做的每个条目作为单独的行显示(即用户'Bob'已经做出了10次预测,因此表将其列为10行)

我希望表显示每个用户名的每列之和,然后按最高总价值排序。

例如,这是它当前显示的内容当前在视图

在这个表中,它应该显示2行-一个用于Archer,一个用于Barry。每个数字列应该是与该用户名相关的所有值的总和。

我已经尝试了几种不同的方法来解决这个问题,但我还没有找到一个解决方案。

我可以用什么来以这种方式输出视图?或者解决方案是一种完全不同的方法?

如何在列表中添加和合并共享用户名的行

这就是我所说的在foreach中分组数据的意思。

@foreach (var item in Model.GroupBy(g => g.AspNetUser.UserName).Select(s => new { UserName = s.Key, Data = s }).ToList())
{
    <tr>
        <td>@Html.DisplayFor(modelItem => item.UserName)</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.PredCorrectScore))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.PredCorrectResult))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.Less15Goals))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.Greater15Goals))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.Less25Goals))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.Greater25Goals))</td>
        <td>@Html.DisplayFor(modelItem => item.Data.Sum(a => a.Greater35Goals))</td>
        @{
            var totals = (item.Data.Sum(a => a.PredCorrectScore)
                + item.Data.Sum(a => a.PredCorrectResult)
                + item.Data.Sum(a => a.Less15Goals)
                + item.Data.Sum(a => a.Greater15Goals)
                + item.Data.Sum(a => a.Less25Goals)
                + item.Data.Sum(a => a.Greater25Goals)
                + item.Data.Sum(a => a.Greater35Goals));
        }
        <td>@totals</td>
    </tr>
}

这里的GroupBy将按UserName (Key)对结果进行分组,并给出IEnumerable<Prediction> (Data)。一旦你有了这个匿名对象,你就可以在你的DisplayFor助手中使用它。您可以使用Sum()来获取每个分组

的总数

在查询中使用groupp by子句.GroupBy(g => g. aspnetuser . username)

var predictions = db.Predictions.GroupBy(g => g.AspNetUser.UserName)
.Select(g => new { username= g.AspNetUser.UserName, SumPredCorrectScore = g.Sum(i => i.PredCorrectScore) })
.Include(p => p.AspNetUser)
.Include(p => p.Prediction1)
.Include(p => p.Match)
.ToList();

像这样,您将需要填写剩余的字段,这没有经过测试,但应该让您朝着正确的方向前进。

J