2015-10-13 82 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,您需要填寫剩餘的字段,這是不測試但應該讓你朝着正確的方向前進。

Ĵ