EntityFramework 6ではSqlFunctions.PatIndexだけどEntityFramework Coreでのパターン検索は?
はじめに
たとえば顧客リストを表示する画面があったとして、顧客を五十音順で検索できるようにしたいということがあります。
こんな画面です
.Net Framework 4.8でEntity Framework6を使っていましたが、このときは以下のようなコードを書いていました。
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を使用して、パターン検索を行っていました。
.NET5にアプリをアップし、Entity Framework Coreを使用すると、SqlFunctions.PatIndexが使えませんでした
SqlFunctions.PatIndexはMicrosoftのドキュメントにあるように.NET Frameworkでしか使えないようです。
そのため、代替手段を考える必要が出てきました。
最初はStartWithやContainsが使えるかなと試したのですが、%といったワイルドカードが使用できなくなるみたいでうまくいきませんでした。
その後調べ続けたところ、見つけたのがこちら
EF.Functions.Like
EF Core 2.0 の新機能で紹介されていました。
var aCustomers =
from c in context.Customers
where EF.Functions.Like(c.Name, "a%")
select c;
これを使うことで、パターン検索ができるみたいです。
変更したコードはこんな感じです
pattern = "[ア-オ]%";
query = query.Where(x => EF.Functions.Like(x.CustomerNameKana, pattern));
これで、以前と同じようにパターン検索が可能となりました。
EF Coreを触ったのが初めてだったので、いろいろとまだまだ知らないことが多そうです。
Author And Source
この問題について(EntityFramework 6ではSqlFunctions.PatIndexだけどEntityFramework Coreでのパターン検索は?), 我々は、より多くの情報をここで見つけました https://qiita.com/mkuwan/items/0e20d59caee2d23f82b8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .