こんにちは、システム開発部の長谷です。

最近また ASP.NET Core で開発をするようになったのですが、Entity Framework Core の Where で情報を
取得するときに、カラム名を変数で動的に指定できることを知って感動したので、
紹介させていただきます。

前置き

まず、以下のようなテーブルデータがあるとします。

Accounts

4しょうぞう小倉祥三5こうたろう南晃太郎

IdNickNameLastNameFirstName
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 を使う際はぜひ参考にしてみて下さい!
短いですが、以上になります。