2017-05-10 3 views
3

私はFirebirdのとNHibernateはを使用していますが、Firebirdの機能にbin_and(a, b)NHibernateはLINQの&演算子RegisterFunction Firebirdの

をビット単位とオペレータを作成したいと思い、このような何か:上記のクエリは、中

var result = customers.Where(c => (c.StatusValue & 3) > 0); 

を発生しますそのような何か:

select * from customers where (StatusValue & 3) > 0 

Fには有効ではありませんirebirdの結果は

select * from customers where bin_and(StatusValue,3) > 0 

この翻訳結果を上書きする可能性はありますか?

更新

これが可能である関数を宣言することによって:

[LinqExtensionMethod("BIN_AND")] 
    public static int BinAnd(int a, int b) 
    { 
    return a & b; 
    } 

var result = customers.Where(c => BinAnd(c.StatusValue, 3) > 0);

これは動作しますが、私はwizhより一般的な方法を探しています " & 'または' | 'オペレータ...

更新:Fédé[email protected]

私はこのような私自身の方言クラスを書いた:

public class MyFirebirdDialect: FirebirdDialect { 
     public MyFirebirdDialect() 
     { 
      // Bitwise operations 
      RegisterFunction("band", new BitwiseFunctionOperation("bin_and")); 
      RegisterFunction("bor", new BitwiseFunctionOperation("bin_or")); 
      RegisterFunction("bxor", new BitwiseFunctionOperation("bin_xor")); 
      RegisterFunction("bnot", new BitwiseFunctionOperation("bin_not")); 
     }  
} 

私はあまりにも

BitwiseFunctionOperation.csをインポートする必要がありました

コードをデバッグすると、このクラスがDialectとして使用されていることがわかります。これは、値「bin_and」を持っていますが、このように、この

var result = customers.Where(c => (c.StatusValue & 3) > 0); 

のようなクエリをSQLで終わるeキー「バンド」:私はLINQのパーサはその一部ではないんだと思う

select * from customers where (StatusValue & 3) > 0 

..

+0

すべての必要なLinqコードは、組み込みのLinqプロバイダのNHibernate v3.0以降にあるようです。適切なSQLを生成していたというHQLの 'band()'を使って[tag:hql]クエリをチェックしましたか? –

+0

明日これをチェックし、応答を与える – Franki1986

+0

私はソースコードをダウンロードし、 'HqlGeneratorExpressionTreeVisitor'は決して呼び出されません。 hqlコマンドは動作しません。私のSQLでは常に&が使用されます。 – Franki1986

答えて

1

あなたは適切な方言を使用していますか? appropriate HQL callに)FirebirdDialectは正しくビット単位を定義し、HQLで(RegisterFunction("band", new BitwiseFunctionOperation("bin_and"));&ExpressionType.Andを翻訳します。

古いNHibernateのバージョンを使用している場合は、多分あなたはアップグレードする必要があります。

Firebirdのビット演算子がで追加されましたNH-3630 in NHibernate 4.1

FirebirdDialectから派生したカスタムダイアレクトを使用して、上記のリンクに示すようにカスタムダイアレクトコンストラクトトルーマン

NHibernate内部では他のいくつかのchangesが必要であり、NHibernate 4.1より前には利用できないので、これは動作しません。おそらく、NHibernate 3.4ソースのローカルコピーにパッチを当てることで、それを成功させることができます。

+0

AhhFrédéricさん、驚きました:-)私はNhibernate 3.4を使用しています。それは.Net 3.5をサポートする最後のバージョンです。 customers.Whereの結果(c =>(c.StatusValue&3)> 0)は希望の 'bin_and'で変換されません – Franki1986

+0

私の編集を参照してください。もちろん、アプリケーションフレームワークをアップグレードする方が良いでしょう。 3.5がサポート終了に近づいています。 –