1

SQL CE 4 で NHibernate 3.1 を使用しています (MsSqlCe40Dialect を使用)。Linq を使用してクエリを生成します。

String.Contains、String.StartsWith、または String.EndsWith を使用すると、無効な SQL が生成されます。

例えば:

Session.Query<User>.Where(user => user.Name.Contains("Joe"))

次のような SQL を生成します。

SELECT Name FROM User WHERE (User.Name like ('%'||@p0||'%'))

これは、実際に生成された SQL からいくらか単純化されていますが、問題は余分な部分にあります。'||...||'

これは SQL CE ダイアレクトの問題だと思いますが、ここからどうすればよいかわかりません。修正/回避策のアイデアはありますか?

4

1 に答える 1

1

これは3.1リリースの直後に修正されたようです(このコミットで)。残念ながら、他の依存関係のためにNHibernateをアップグレードできません。MsSqlCe40Dialectそれまでの間、次のコードでサブクラス化することで問題を回避しました。

using NHibernate;
using NHibernate.Dialect;
using NHibernate.Dialect.Function;

namespace DataAccess
{
    public class CustomMsSqlCe40Dialect : MsSqlCe40Dialect
    {
        public CustomMsSqlCe40Dialect ()
        {
            RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
        }
    }
}
于 2012-05-10T16:33:44.450 に答える