こんにちは、システム開発部の長谷です。
最近また ASP.NET Core で開発をするようになったのですが、Entity Framework Core の Where で情報を
取得するときに、カラム名を変数で動的に指定できることを知って感動したので、
紹介させていただきます。
前置き
まず、以下のようなテーブルデータがあるとします。
Accounts
4しょうぞう小倉祥三5こうたろう南晃太郎
Id | NickName | LastName | FirstName |
1 | れな | 畠山 | 麗奈 |
2 | としあき | 松崎 | 俊明 |
3 | せな | 石井 | 世奈 |
※テスト用データであり、こちらのサイトから抽出しました。
こちらのデータからカラムと値をそれぞれ指定してレコードを抽出したいと思います。
普通のやり方
普通のやり方では カラムをそもそも動的に指定することができないため、以下の様なコードになります
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 を使う際はぜひ参考にしてみて下さい!
短いですが、以上になります。