EntityFramework 6ではSqlFunctions.PatIndexだけどEntityFramework Coreでのパターン検索は？

#はじめに
たとえば顧客リストを表示する画面があったとして、顧客を五十音順で検索できるようにしたいということがあります。
こんな画面です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/40d3cec0-02da-e847-48e0-c90af2a8d11f.png)

.Net Framework 4.8でEntity Framework6を使っていましたが、このときは以下のようなコードを書いていました。

```C#
   using System.Data.Entity.SqlServer;

   var query = dbContext.Customers;

   //五十順
    string pattern = string.Empty;
    switch (kanaState)
    {
        case KanaButtonValue.A:
            {
                pattern = "[ア-オ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.KA:
            {
                pattern = "[カ-ゴ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.SA:
            {
                pattern = "[サ-ゾ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.TA:
            {
                pattern = "[タ-ド]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.NA:
            {
                pattern = "[ナ-ノ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.HA:
            {
                pattern = "[ハ-ボ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.MA:
            {
                pattern = "[マ-モ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.YA:
            {
                pattern = "[ヤ-ヨ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.RA:
            {
                pattern = "[ラ-ロ]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.WA:
            {
                pattern = "[ワ-ン]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) > 0);
                break;
            }
        case KanaButtonValue.OTHER:
            {
                pattern = "[ア-ン]%";
                query = query.Where(x => SqlFunctions.PatIndex(pattern, x.CustomerNameKana) == 0);
                break;
            }
    }
```

[SqlFunctions.PatIndex](https://docs.microsoft.com/ja-jp/dotnet/api/system.data.objects.sqlclient.sqlfunctions.patindex?view=netframework-4.8)を使用して、パターン検索を行っていました。

#.NET5にアプリをアップし、Entity Framework Coreを使用すると、SqlFunctions.PatIndexが使えませんでした
SqlFunctions.PatIndexはMicrosoftのドキュメントにあるように.NET Frameworkでしか使えないようです。
そのため、代替手段を考える必要が出てきました。

最初はStartWithやContainsが使えるかなと試したのですが、%といったワイルドカードが使用できなくなるみたいでうまくいきませんでした。
その後調べ続けたところ、見つけたのが[こちら](https://docs.microsoft.com/ja-jp/ef/core/what-is-new/ef-core-2.0/)

#EF.Functions.Like
[EF Core 2.0 の新機能](https://docs.microsoft.com/ja-jp/ef/core/what-is-new/ef-core-2.0/)で紹介されていました。

```C#
var aCustomers =
    from c in context.Customers
    where EF.Functions.Like(c.Name, "a%")
    select c;
```
これを使うことで、パターン検索ができるみたいです。
変更したコードはこんな感じです

```C#
    pattern = "[ア-オ]%";
    query = query.Where(x => EF.Functions.Like(x.CustomerNameKana, pattern));
```

これで、以前と同じようにパターン検索が可能となりました。
EF Coreを触ったのが初めてだったので、いろいろとまだまだ知らないことが多そうです。