2017-01-13 30 views
1

これは私の最初のASP.NETコアプロジェクトです。私は、Index.cshtmlページに検索ボックスとボタンがある単一のページアプリケーションを持っています。検索ボックステキストが空白の場合は、何も表示されず、pIdに対応するレコードが検索され、Index.cshtmlページに表示されます。これまでのところ、これは素晴らしい動作です。検索結果と集計結果が1つのビューASP.NETコア

私は特定の日のために重量を集約することで、このビューを拡張し、ユーザーがPIDが入り、ページを送信すると、私は

pId total_weight create_dt 

を表示したいと思いますtop.Soでそれを表示するために探しています

その下に、私がすでに持っている現在のビューになります

pId bIdc rule_id weight create_dt 

私はスコアを集計すべきかどうか分かりませんか?集計値を表示するために現在のビューを更新するにはどうすればよいですか?

コントローラ

public IActionResult Index(string pId) 
{ 
     var scores = from ts in _context.Scores 
          select ts; 

     if (!string.IsNullOrEmpty(pId)) 
     { 
      scores = scores.Where(p => p.p_id.Equals(pId)).OrderByDescending(p => p.create_dt); 

      return View(scores.ToList()); 
     } 
     else 
      return View(); 
    } 

Index.cshtml

<div id="p-form"> 
<form asp-controller="Score" asp-action="Index" method="get"> 
    <p> 
     <b> P Id:</b> <input type="text" name="pId"> 
     <input type="submit" value="Submit" /> 
    </p> 
</form> 
</div> 
@if (Model != null) 
{ 
    <div id="p-scores"> 
     <table class="table"> 
      <thead> 
      <tr> 
       <th> 
        @Html.DisplayNameFor(model => model.p_id) 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.b_idc) 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.rule_id) 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.weight) 
       </th> 
       <th> 
        @Html.DisplayNameFor(model => model.create_dt) 
       </th> 
      </tr> 
     </thead> 
      <tbody> 
      @foreach (var item in Model) 
      { 
       <tr> 
        <td> 
         @Html.DisplayFor(model => item.p_id) 
        </td> 
        <td> 
         @Html.DisplayFor(model => item.b_idc) 
        </td> 
        <td> 
         @Html.DisplayFor(model => item.rule_id) 
        </td> 
        <td> 
         @Html.DisplayFor(model => item.weight) 
        </td> 
        <td> 
         @Html.DisplayFor(model => item.create_dt) 
        </td> 
       </tr> 
      } 
     </tbody> 
     </table> 
    </div> 
} 
+0

に型付けされていることを確認し、ビューにグループ化された結果を返すされているので、あなたは 'GroupBy'方法を試してみましたか? – Shyju

+0

私はgroupbyをどこで使用するのですか?コントローラーで、どのように表示するのですか? –

答えて

1

あなたはグループにデータをGROUPBYメソッドを使用することができます。日付に基づいて

私は(各PID)その中で今、あなたは、データを取得するとき、pidで最初のグループと各項目のグループ化されたデータ

public class WeightItemTotal 
{ 
    public int PId { set; get; } 
    public decimal TotalWeight { set; get; } 
    public DateTime CreatedDate { set; get; } 
} 

を表す新しいクラスを作成し、グループの結果とSumメソッドを使用して総重量を取得します。

var resultGrouped = new List<WeightItemTotal>(); 

var pgrouped = _context.Scores.Where(c=>c.p_id==pId) 
           .GroupBy(a => a.PId); 
foreach (var p in pgrouped) 
{ 
    var grouped = p.GroupBy(f => f.CreatedDate, items => items, (key, val) 
                    => new WeightItemTotal 
    { 
     PId = val.FirstOrDefault().PId, 
     CreatedDate = key, 
     TotalWeight = val.Sum(g => g.Weight) 
    }).ToList(); 

    resultGrouped.AddRange(grouped); 
} 
return View(resultGrouped); 

我々は、それが強く、そのタイプ

@model IEnumerable<WeightItemIotal> 
<table> 
@foreach(var p in Model) 
{ 
    <tr> 
     <td>@p.PId</td> 
     <td>@p.TotalWeight</td> 
     <td>@p.CreatedDate</td> 
    </tr> 
} 
</table> 
+0

ありがとう、私はScoreAggモデルで新しいクラスを作成し、レコードを使用してそれを設定し、ViewData ["AggScores"]に保存してビューで使用しました。 –