はい、可能です。
ASP.NET Core MVC では、Model クラスに計算用のプロパティ(Balance列)を追加し、Amount の値を元に計算して返すようにすれば、DBに列を追加しなくてもビューで表示できます。
もし DB にも Balance 列を持たせたい場合は、マイグレーションで列を追加し、保存時に計算してセットします。
以下に Entity Framework Core を使ったサンプル を示します。
1. モデルクラス(計算列として Balance を追加)
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcSample.Models
{
public class Transaction
{
[Key]
public int Id { get; set; }
[Column(TypeName = "decimal(18,2)")]
public decimal Amount { get; set; }
// DBに保存しない計算列
[NotMapped]
public decimal Balance { get; set; }
}
}
2. コントローラー(Amount から Balance を計算)
using Microsoft.AspNetCore.Mvc;
using MvcSample.Data;
using MvcSample.Models;
using System.Linq;
namespace MvcSample.Controllers
{
public class TransactionsController : Controller
{
private readonly ApplicationDbContext _context;
public TransactionsController(ApplicationDbContext context)
{
_context = context;
}
public IActionResult Index()
{
var transactions = _context.Transactions
.OrderBy(t => t.Id)
.ToList();
decimal runningTotal = 0;
foreach (var t in transactions)
{
runningTotal += t.Amount;
t.Balance = runningTotal; // 計算してセット
}
return View(transactions);
}
}
}
3. ビュー(Index.cshtml)
@model IEnumerable<MvcSample.Models.Transaction>
<table class="table">
<thead>
<tr>
<th>Amount</th>
<th>Balance</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.Amount</td>
<td>@item.Balance</td>
</tr>
}
</tbody>
</table>
4. ポイント
[NotMapped] 属性を付けると、Balance は DB に保存されず、アプリ内で計算専用の列として使えます。Index アクションで 累積計算 を行い、ビューに渡す前に Balance に値をセットしています。- DB に Balance 列を持たせたい場合は、
[NotMapped] を外し、マイグレーションで列を追加し、保存時に計算してセットします。
もしご希望であれば、このサンプルを DBにBalance列を追加して保存するバージョン に書き換えたコードも作成できます。
そうすれば SQL 側でも直接 Balance を参照できます。
このまま計算列のままで使いますか?それとも DB に保存する形にしますか?
Powered by Froala Editor