私は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
..
すべての必要なLinqコードは、組み込みのLinqプロバイダのNHibernate v3.0以降にあるようです。適切なSQLを生成していたというHQLの 'band()'を使って[tag:hql]クエリをチェックしましたか? –
明日これをチェックし、応答を与える – Franki1986
私はソースコードをダウンロードし、 'HqlGeneratorExpressionTreeVisitor'は決して呼び出されません。 hqlコマンドは動作しません。私のSQLでは常に&が使用されます。 – Franki1986