記事詳細


投稿日
2026年09月20日01時11分
タイトル

ASP.NET Core MVC: Paymentテーブルのposte列の月番号をDistinctする(重複排除)query です:「 var today = DateTime.Today var dstnctPost = _context.Payments .Where(p => p.Posted.Year == today.Year) .Select(p => p.Posted.Month) .Distinct() .OrderBy(m => m) .ToList(); 」 このqueryでtoday.Monthが1または2の場合は前年の12も含めるquery文を教えてください。

内容

なるほど、
今のクエリは「今年の Posted.Month を重複排除して昇順取得」ですが、
1月または2月の場合は前年の12月も含めたいという条件ですね。

これは Where 条件 を少し工夫すれば実現できます。

修正版クエリ(C# / LINQ to Entities)

Csharp
var today = DateTime.Today; var dstnctPost = _context.Payments .Where(p => // 今年のデータ p.Posted.Year == today.Year // 1月または2月の場合は前年12月も含める || ((today.Month == 1 || today.Month == 2) && p.Posted.Year == today.Year - 1 && p.Posted.Month == 12) ) .Select(p => p.Posted.Month) .Distinct() .OrderBy(m => m) .ToList();

ポイント

  1. 条件分岐を Where 内に直接書く
    • today.Month が 1 または 2 の場合だけ前年12月を追加。
  2. Distinct → OrderBy の順序はそのまま。
  3. LINQ to Entities なので、DateTime のプロパティ (Year, Month) はそのまま使えます。

  • today = 2026-01-15
    → 2026年の全月 + 2025年12月が対象
  • today = 2026-03-01
    → 2026年の全月のみ(前年12月は含まれない)

もし「前年12月だけでなく、前年11月や10月も含めたい」などの拡張も簡単にできます。
その場合は p.Posted.Month >= 10 のように条件を変えるだけです。

このクエリは SQL に変換されても効率的 で、
不要なデータをメモリに持ってこない形になっています。

必要なら、このクエリを 月番号だけでなく "年+月" のペアで重複排除 する形にもできますが、
今の要件だとこのままで十分です。

もし希望があれば、「年+月のペアをDistinctして昇順」 のバージョンも作れますが、
作りますか?
そうすると前年12月と今年の1月・2月の並びが自然になります。

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Controllers
編集 | 記事一覧