2015-10-13 89 views
0

我的项目是一个游戏,用户尝试预测足球比赛的得分并根据不同的标准获得积分。我正在使用MVC和实体框架。如何在列表中共享和合并共享用户名的行

我想创建一个显示每个用户总分的排行榜。我已经达到了某个程度,但我坚持下一步要去哪里。

目前我有显示各预测到使用该剃刀视图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); 

这当前显示的用户提出的各行中的每个条目(即用户“鲍勃”已取得10个预测这样的表格列出了此作为10行)

我想要的表中显示的每一列的总和为每个用户名和然后排序最高的总值的表。

例如,这是它当前显示 Currently in the View

在此表中它应该显示2行 - 一个用于射手和一个用于巴里。每个数字列应该是与该用户名相关的所有值的总和。

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

我能用这种方式获得视图输出吗?或者解决方案是不同的方法吗?

+1

您可以创建一个新模型,该模型具有用户名属性以及所需的分数属性,并使用GroupBy()lambda表达式在控制器中创建新模型。或你可以在你的视图的foreach中创建一个匿名对象。无论采用哪种方式,你都需要使用GroupBy对记录进行分组。 – JamieD77

+0

感谢您的评论杰米。如果成功,我会尝试你的建议并报告。 –

回答

0

这就是我的意思在你的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(密钥),给你一个IEnumerable<Prediction>(数据)。一旦你有这个匿名对象,你可以在你的DisplayFor帮助器中使用它。您可以使用Sum()获取每个分组的总计

0

在查询 .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(); 

像这样的事情BY子句使用groupp,您需要填写剩余的字段,这是不测试但应该让你朝着正确的方向前进。

Ĵ