17

アクセント記号付きの名前を含むデータベーステーブルがあります。などäなど。

アクセントに関係なく、いくつかの部分文字列を含むテーブルからEF4を使用してすべてのレコードを取得する必要があります。

したがって、次のコード:

myEntities.Items.Where(i => i.Name.Contains("a")); 

を含む名前のすべてのアイテムを返す必要がありますが、などaを含むすべてのアイテムも返す必要があります。これは可能ですか?äâ

4

5 に答える 5

15

[名前]列でアクセントに依存しない照合順序を設定すると、クエリは必要に応じて機能するはずです。

于 2011-06-15T12:38:00.937 に答える
11

アクセントに影響されない照合を設定すると、問題が修正されます。

次のクエリで、SQLServerとAzureデータベースの列の照合を変更できます。

ALTER TABLE TableName
ALTER COLUMN ColumnName NVARCHAR (100)
COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NOT NULL

SQL_LATIN1_GENERAL_CP1_CI_AILATIN1_GENERALは、英語(米国)、CP1コードページ1252、CI大文字と小文字を区別せず、 AIアクセントを区別しない照合です。

于 2015-07-03T15:03:56.283 に答える
0

私はそれがそれほどきれいな解決策ではないことを知っていますが、これを読んだ後、私は次のようなことを試みました:

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」オブジェクトのメソッドを呼び出すことができます。

于 2014-02-18T02:47:28.387 に答える
0

次のように、入力文字列に照合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();
于 2021-10-21T11:24:19.870 に答える
-2

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")); 
于 2011-06-15T12:36:04.760 に答える