質問するログイン新規登録

Q&A

1回答

81閲覧

ドロップダウンリストで並び替えするには?

hokkai

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Entity Framework Core

Entity Framework Core (EF Core) は、Microsoftが開発した.NET向けのオブジェクトデータベースマッパー(ORM)です。LINQクエリをサポートしており、さまざまなデータベースに対応しています。

0グッド

0クリップ

投稿2026/01/29 04:00

0

0

実現したいこと

レコードの日付列から重複なしドロップダウンリストを作っています
日付列が文字列であるためドロップダウンリストが整列してくれません
日付列をDate型にする事が出来ないのですが並び替える方法はありますか?

発生している問題・分からないこと

Entity frameworkのLINQで並び替えする方法

該当のソースコード

C#

1// モデル 2 public class Db11 3 { 4 public string? hiduke { get; set; } 5 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 6 [Key] 7 public int id { get; set; } 8 } 9 10// Listモデル 11 public class Db11SyuruiViewModel 12 { 13 public List<Db11>? Db11s { get; set; } 14 public SelectList? Hidukes { get; set; } 15 }

C#

1// ビュー 2 @model Syuukei.Models.Db11SyuruiViewModel 3 4 @{ 5 ViewData["Title"] = "Index"; 6 } 7 8 <h1>Index</h1> 9 10 <p> 11 <a asp-action="Create">新規作成</a> 12 </p> 13 14 <form asp-controller="Db11" asp-action="Index" method="get"> 15 <p> 16 <select asp-for="Db11Hiduke" asp-items="Model.Hidukes"> 17 <option value="">全て</option> 18 </select> 19 </p> 20 </form> 21 22 @if (ViewBag.Message != null) 23 { 24 <p>@ViewBag.Message</p> 25 } 26 <table class="table"> 27 <thead> 28 <tr> 29 <th> 30 @Html.DisplayNameFor(model => model.Db11s[0].hiduke) 31 </th> 32 <th></th> 33 </tr> 34 </thead> 35 <tbody> 36 @foreach (var item in Model.Db11s) { 37 <tr> 38 <td> 39 @Html.DisplayFor(modelItem => item.hiduke) 40 </td> 41 <td> 42 <a asp-action="Edit" asp-route-id="@item.id">Edit</a> | 43 <a asp-action="Details" asp-route-id="@item.id">Details</a> | 44 <a asp-action="Delete" asp-route-id="@item.id">Delete</a> 45 </td> 46 </tr> 47 } 48 </tbody> 49 </table>

C#

1// コントローラー 2 public async Task<IActionResult> Index(string db11Hiduke) 3 { 4 // db11テーブルから全ての日付を取得する 5 var hidukeQuery = _context.Db11 6 .OrderBy(m => m.hiduke) 7 .Select(m => m.hiduke); 8 9 // db11テーブルから全てのデータを取得するLINQクエリ 10 var db11s = _context.Db11.Select(m => m); 11 12 // 日付検索処理 13 if (!string.IsNullOrEmpty(db11Hiduke)) 14 { 15 // 選択した日付と一致するデータを抽出する 16 db11s = db11s.Where(a => a.hiduke == db11Hiduke); 17 } 18 19 // 日付データを重複なしリストにしてプロパティに格納する 20 var db11SyuruiVM = new Db11SyuruiViewModel 21 { 22 Hidukes = new SelectList(await hidukeQuery.Distinct().ToListAsync()), 23 Db11s = await db11s.ToListAsync() 24 }; 25 26 // ViewModelをビューに渡す 27 return View(db11SyuruiVM); 28 }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

やったこと
コントローラーのORDERBYを日付型にキャストして並び替えられないか?
.OrderBy(m => m.hiduke)

.OrderBy(m => DateTime.Parse(m.hiduke))
結果
内部サーバーエラー (リクエストの処理中に未処理の例外が発生しました)

補足

ASP.NET Core MVC Visual Studio Community 2026 Windows11 Pro PostgreSQL18

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

KOZ6.0

2026/01/31 03:43

hiduke にはどのような値が入っているのでしょうか?
guest

回答1

0

DateTime.Parse で例外が発生していると思われるので、Db11 クラスに読み取り専用プロパティを追加してソートをかければいいと思います。

csharp

1public class Db11 2{ 3 public string? hiduke { get; set; } 4 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 5 [Key] 6 public int id { get; set; } 7 8 [NotMapped] 9 public DateTime SortKey { 10 get 11 { 12 if (DateTime.TryParse(hiduke, out DateTime dt)) 13 { 14 return dt; 15 } 16 else 17 { 18 return DateTime.MinValue; 19 } 20 } 21 22 } 23}

クエリの実行は以下のようにします。

csharp

1var sortedData = _context.Db11 2 .AsEnumerable() // ここで SQL が実行され、全データがメモリに乗る 3 .OrderBy(m => m.SortKey) // C# のプロパティとしてソート 4 .Select(m => m.hiduke);

投稿2026/01/31 03:48

編集2026/01/31 06:09
KOZ6.0

総合スコア2751

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問