アクセント記号付きの名前を含むデータベーステーブルがあります。などä
など。
アクセントに関係なく、いくつかの部分文字列を含むテーブルからEF4を使用してすべてのレコードを取得する必要があります。
したがって、次のコード:
myEntities.Items.Where(i => i.Name.Contains("a"));
を含む名前のすべてのアイテムを返す必要がありますが、などa
を含むすべてのアイテムも返す必要があります。これは可能ですか?ä
â
アクセント記号付きの名前を含むデータベーステーブルがあります。などä
など。
アクセントに関係なく、いくつかの部分文字列を含むテーブルからEF4を使用してすべてのレコードを取得する必要があります。
したがって、次のコード:
myEntities.Items.Where(i => i.Name.Contains("a"));
を含む名前のすべてのアイテムを返す必要がありますが、などa
を含むすべてのアイテムも返す必要があります。これは可能ですか?ä
â
[名前]列でアクセントに依存しない照合順序を設定すると、クエリは必要に応じて機能するはずです。
アクセントに影響されない照合を設定すると、問題が修正されます。
次のクエリで、SQLServerとAzureデータベースの列の照合を変更できます。
ALTER TABLE TableName
ALTER COLUMN ColumnName NVARCHAR (100)
COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NOT NULL
SQL_LATIN1_GENERAL_CP1_CI_AI
LATIN1_GENERAL
は、英語(米国)、CP1
コードページ1252、CI
大文字と小文字を区別せず、 AI
アクセントを区別しない照合です。
私はそれがそれほどきれいな解決策ではないことを知っていますが、これを読んだ後、私は次のようなことを試みました:
var query = this.DataContext.Users.SqlQuery(string.Format("SELECT * FROM dbo.Users WHERE LastName like '%{0}%' COLLATE Latin1_general_CI_AI", parameters.SearchTerm));
その後も、Count、OrderBy、Skipなどの「query」オブジェクトのメソッドを呼び出すことができます。
次のように、入力文字列に照合SQL_Latin1_General_CP1253_CI_AIを適用することにより、発音区別符号を削除するSQL関数を作成できます。
CREATE FUNCTION [dbo].[RemoveDiacritics] (
@input varchar(max)
) RETURNS varchar(max)
AS BEGIN
DECLARE @result VARCHAR(max);
select @result = @input collate SQL_Latin1_General_CP1253_CI_AI
return @result
END
次に、属性DbFunctionを使用してマッピングし、DBコンテキスト(この場合はApplicationDbContext)に追加します。
public class ApplicationDbContext : IdentityDbContext<CustomIdentityUser>
{
[DbFunction("RemoveDiacritics", "dbo")]
public static string RemoveDiacritics(string input)
{
throw new NotImplementedException("This method can only be used with LINQ.");
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
そして、それをLINQクエリで使用します。例:
var query = await db.Users.Where(a => ApplicationDbContext.RemoveDiacritics(a.Name).Contains(ApplicationDbContext.RemoveDiacritics(filter))).tolListAsync();
Stuart Dunkeldが提案したアクセントに依存しない照合は、間違いなく最良の解決策です...
しかし、知っておくとよいでしょう。
Michael Kaplanは、発音区別符号の除去について投稿したことがあります。
static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for(int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if(uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return(sb.ToString().Normalize(NormalizationForm.FormC));
}
したがって、コードは次のようになります。
myEntities.Items.Where(i => RemoveDiacritics(i.Name).Contains("a"));