2012-05-09 5 views
1

私はSQL CE 4でNHibernate 3.1を使用しています(MsSqlCe40Dialectの使用)。 Linqを使ってクエリを生成する。SQL CEで無効なSQLを作成するNHibernate/Linq

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

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

これが多少生成された実際のSQLから簡略化されますが、問題は、私は期待して余分な'||...||'

であるされています

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

は次のようにSQLを生成これはSQL CEの方言の問題ですが、ここからどこに行くのかはわかりません。修正/回避策のアイデアはありますか?

+0

あなたは、この特定のケースのためにHQLを使用することができます。一方で、私は次のコードでMsSqlCe40Dialectをサブクラス化することで問題を回避してきましたか? –

+0

これは実際にはより大きなクエリの一部です。私はそれを可能な限りLinqだけにしておきたい。あなたはLinqとHQLまたは基準を組み合わせる方法を知っていますか? – andypaxo

+0

HQLを使用して全体を記述しますか? – Baz1nga

答えて

1

これは、3.1リリースの直後に修正されたようです(in this commit)。残念ながら、他の依存関係のためにNHibernateをアップグレードすることはできません。

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

namespace DataAccess 
{ 
    public class CustomMsSqlCe40Dialect : MsSqlCe40Dialect 
    { 
     public CustomMsSqlCe40Dialect() 
     { 
      RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); 
     } 
    } 
} 
関連する問題