2011-06-27 6 views
3

NHibernateの新機能で、新しいプロジェクトのためにFluentNhibernateを使用しています。非常に単純なlinqクエリを実行すると、私は奇妙な問題に遭遇しました。NHibernate LINQ Containsが機能しない

クエリ1 - は非常にうまく機能

 //Query 1 
      var customers = from customer in _session.Query<Customer>() 
         where customer.FirstName == "john" 
         select new 
         { 
          customer.FirstName, 
          customer.LastName 
         }; 

クエリ2が実行されたの下に、私は

 //Query 2. 
      var customers = from customer in _session.Query<Customer>() 
         where customer.FirstName.Contains("john") 
         select new 
         { 
          customer.FirstName, 
          customer.LastName 
         }; 

NHは、クエリが生成された "クエリを実行できませんでした" エラーが出る

Customer0_.FirstNameをcol_0_0_、customer0_.LastName as col_1_0_ from tblCustomer customer0_ ここでcustomer0_.FirstName l IKE(@ P0 || '%' || '%'); @ P0 = 'ジョン'

それが生成した(@ P0 || '%' || '%')のような姓代わりにFirstNameは( '%' + @ p0 + '%')のようにわかります。私が使用しています

データベースはSQLServerCEとNHibernateのバージョンは3.1.0

である。この問題を解決する助けてください。 SQL CE用

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); 

でなければなりません

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "||", ")")); 

+2

使用しているNHibernateはのバージョンは何? – Variant

+1

あなたが使用しているSQL方言の文字列連結のための '* |'は*オプションではありませんか?どのデータベースを使用していますか?実際にクエリが失敗しますか? –

+0

NHibernateを使用しています。3.1.0 – tglk

答えて

4

これは "Dialect.cs" ファイル(NHの基本方言クラス)でのconcat関数の定義です。 したがって、MsSqlCe40Dialectクラスを使用する必要があります。 私はあなたがそれをこのように定義することができますので、それは、まだ流暢 - NHibernateはに登録されていないと思う:

... MsSqlCeConfiguration.Standard 
         ... 
         .Dialect<MsSqlCe40Dialect>(); 

も不足している機能の残りのパッチは承認待ち、そこにある: https://nhibernate.jira.com/browse/NH-2723 投票してください!あなたがあなた自身の方言を作成することができます一方

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

namespace Test1 
{ 
    public class TempSqlCeDialect : MsSqlCeDialect 
    { 
     public TempSqlCeDialect() 
     { 
      RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); 
     } 
    } 
} 

そして、あなたは定義することによって、それを使用することができます:

... MsSqlCeConfiguration.Standard.Dialect<TempSqlCeDialect>() ... 
+0

ダイアレクトをMsSqlCe40Dialectに変更しましたが、まだ動作していません。そのバグが修正されるまで待ちますか? – tglk

+0

最後の投稿を編集して "TempSqlCeDialect"を追加しました。それは問題を解決するはずです。 – VahidN

+0

ありがとう!自分の方言を作成することで問題が解決しました。 – tglk

関連する問題