【Entity Framework Core】Where文でカラムを変数で指定する方法【ASP.NET Core】
こんにちは、システム開発部の長谷です。
最近また ASP.NET Core で開発をするようになったのですが、Entity Framework Core の Where で情報を
取得するときに、カラム名を変数で動的に指定できることを知って感動したので、
紹介させていただきます。
前置き
まず、以下のようなテーブルデータがあるとします。
Accounts
Id | NickName | LastName | FirstName |
---|---|---|---|
1 | れな | 畠山 | 麗奈 |
2 | としあき | 松崎 | 俊明 |
3 | せな | 石井 | 世奈 | 4 | しょうぞう | 小倉 | 祥三 | 5 | こうたろう | 南 | 晃太郎 |
※テスト用データであり、こちらのサイトから抽出しました。
こちらのデータからカラムと値をそれぞれ指定してレコードを抽出したいと思います。
普通のやり方
普通のやり方では カラムをそもそも動的に指定することができないため、以下の様なコードになります
string columnName = "LastName"; // カラム名 string value = "畠山"; // 検索値 // 指定されたカラム名と値からレコードを抽出 var query = context.Accounts; switch (columnName) { // NickName カラムを指定した場合 case "NickName": query = query.Where(c => c.NickName== value); break; // LastName カラムを指定した場合 case "LastName": query = query.Where(c => c.LastName== value); break; // FirstName カラムを指定した場合 case "FirstName": query = query.Where(c => c.FirstName == value); break; } var account = query.FirstOrDefault();
と switch 文でそれぞれのカラム名を case で比較していくという、かなり冗長的なコードになってしまいます。
カラム名を変数で指定するやり方
ですが、Entity Framework Core にはカラム名を動的に指定する方法があります!
それが、EF.Property メソッドというものです。
こちらは、引数でプロパティ(カラム名)を動的に指定することができる優れものとなっております。
実際に先ほどのコードをこのメソッドを使った形に修正すると
string columnName = "FirstName"; // カラム名 string value = "世奈"; // 検索値 // 指定されたカラム名と値からレコードを抽出 var account = context.Accounts.Where(c => EF.Property<string>(c, columnName) == value).FirstOrDefault();
と switch 文を使わず、なんと1行で書けるようになりました。
※ Microsoft.Entity Framework Core を using する必要があります。
まとめ
いかがだったでしょうか?
個人的にはかなり便利な機能だと思いました。
リッチな検索機能を実装したいときとかに、きっと活躍してくれると思いますので、
Entity Framework Core を使う際はぜひ参考にしてみて下さい!
最後に
私が所属するシステム開発のサービスサイト「SEKARAKU Lab(セカラク ラボ)」を開設しました。
ビヨンドは、サーバーの設計・構築から運用までをワンストップでお任せいただけますので、サーバーサイド開発でお困りの方はお気軽にお問い合わせください。
SEKARAKU Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
短いですが、以上になります。