TryGetValue の辞書データを DBから取得 する形に変更します。
これにより、ID辞書がコード固定ではなく、DBのマスタテーブルから動的に読み込まれるようになります。
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
public class Payment
{
public int PaymentId { get; set; } // DB側で自動生成
public DateTime Posted { get; set; }
public bool InOut { get; set; }
public int? SubjectNameId { get; set; }
public string ItemName { get; set; }
public string PaymentName { get; set; }
public int? PaymentTypeId { get; set; }
public int? PaymentMethodId { get; set; }
public int? IncomeCategoryId { get; set; }
public int? IncomeTypeId { get; set; }
public decimal Amount { get; set; }
}
// マスタテーブル例
public class SubjectName
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PaymentType
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PaymentMethod
{
public int Id { get; set; }
public string Name { get; set; }
}
public class IncomeCategory
{
public int Id { get; set; }
public string Name { get; set; }
}
public class IncomeType
{
public int Id { get; set; }
public string Name { get; set; }
}
// DbContext
public class AppDbContext : DbContext
{
public DbSet<Payment> Payments { get; set; }
public DbSet<SubjectName> SubjectNames { get; set; }
public DbSet<PaymentType> PaymentTypes { get; set; }
public DbSet<PaymentMethod> PaymentMethods { get; set; }
public DbSet<IncomeCategory> IncomeCategories { get; set; }
public DbSet<IncomeType> IncomeTypes { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
}
public interface IPaymentService
{
List<Payment> GeneratePayments();
}
public class PaymentService : IPaymentService
{
private readonly AppDbContext _context;
public PaymentService(AppDbContext context)
{
_context = context;
}
private static int? GetId(Dictionary<string, int> dict, string key)
{
return dict.TryGetValue(key, out var value) && value != 0 ? value : (int?)null;
}
public List<Payment> GeneratePayments()
{
int thisYear = DateTime.Now.Year;
int previousMonth = DateTime.Now.Month - 1;
if (previousMonth == 0) { previousMonth = 12; thisYear--; }
// DBから辞書を構築
var subjectNameDict = _context.SubjectNames.ToDictionary(s => s.Name, s => s.Id);
var paymentTypeDict = _context.PaymentTypes.ToDictionary(p => p.Name, p => p.Id);
var paymentMethodDict = _context.PaymentMethods.ToDictionary(m => m.Name, m => m.Id);
var incomeCategoryDict = _context.IncomeCategories.ToDictionary(c => c.Name, c => c.Id);
var incomeTypeDict = _context.IncomeTypes.ToDictionary(t => t.Name, t => t.Id);
// 複数のPaymentデータ定義(キー名と金額)
var paymentData = new[]
{
new { SubjectKey = "家計", TypeKey = "予算", MethodKey = "現金", CategoryKey = "給与", IncomeTypeKey = "定期", Amount = 268000m, ItemName = "今月予算" },
new { SubjectKey = "事業", TypeKey = "支出", MethodKey = "銀行振込", CategoryKey = "副業", IncomeTypeKey = "臨時", Amount = 150000m, ItemName = "事業支出" }
};
var payments = new List<Payment>();
foreach (var data in paymentData)
{
payments.Add(new Payment
{
Posted = new DateTime(thisYear, previousMonth, 1),
InOut = true,
SubjectNameId = GetId(subjectNameDict, data.SubjectKey),
ItemName = data.ItemName,
PaymentName = null,
PaymentTypeId = GetId(paymentTypeDict, data.TypeKey),
PaymentMethodId = GetId(paymentMethodDict, data.MethodKey),
IncomeCategoryId = GetId(incomeCategoryDict, data.CategoryKey),
IncomeTypeId = GetId(incomeTypeDict, data.IncomeTypeKey),
Amount = data.Amount
});
}
return payments;
}
}
public class PaymentsController : Controller
{
private readonly IPaymentService _paymentService;
public PaymentsController(IPaymentService paymentService)
{
_paymentService = paymentService;
}
public IActionResult Index()
{
var payments = _paymentService.GeneratePayments();
return View(payments);
}
}
改良点
辞書データをDBから取得
固定値ではなく、マスタテーブルから ToDictionary で動的に生成。
Entity Framework Core対応
AppDbContext を使ってマスタテーブルと Payment を管理。
再利用性と保守性向上
マスタデータが変わってもコード修正不要。DB更新だけで反映。
MVC構造完全対応
コントローラーからサービスを呼び出し、ビューに渡す。
この形なら、実際の ASP.NET Core MVC + EF Core プロジェクトで動作し、
マスタデータをDBから取得して TryGetValue で安全に Payment を生成できます。
もし希望があれば、このコードを 非同期処理(async/await)対応 にしてさらに効率化できますが、それも作りますか?
Powered by Froala Editor