1

私のデータベースの一部のレコードには角かっこが含まれています。

dafalgan [1gram]
valium [15mg]
...

ただし、次の式を使用してNHibernate.Linqでこれをクエリする場合

return x => x.Description.Contains(searchTerm)

ここで、searchTermは'dafalgan [1gram]'であり、次のSQLが使用/生成されます。

SELECT        FieldName1, FieldName2
FROM            TableName
WHERE        (Description LIKE '%' + N'dafalgan [1gram]' + '%')

[SQL Serverは、角かっこで囲まれた文字のいずれかに対する正規表現の一致の開始と見なすため、これは結果を返しません。これはSQLServerの問題であり、pl-sqlは[特殊文字とは見なされません。

NH-938Restrictions.Likeは、エスケープ文字を渡すことを許可するためのオーバーロードについて言及していますが、使用されるコード(NHibernate.Linqの一部)を制御できません。

私は自分のコードでaを実行できることを知ってsearchTerm.Replace("[", "[[]");いますが、より一般的な解決策を探していました。これはSQLServerにのみ固有であるため、Hibernate.Dialect.MsSql2000Dialectに追加します。

4

1 に答える 1

0

@Jamie Ideのリンクに基づいて、次のことが私のために機能します。

    private static AbstractCriterion MatchModeAnywhereSafeCriterion(string propertyName, string value)
    {
        const char escapeChar = '\u001B';
        var safeValue = value.Replace("%", escapeChar + "%").Replace("_", escapeChar + "_")
            .Replace("[", escapeChar + "[");
        return Restrictions.Like(propertyName, safeValue, MatchMode.Anywhere, escapeChar);
    }
于 2019-03-21T15:09:02.180 に答える