J'utilise NHibernate avec Firebird et voudrais créer l'opérateur de bits et l'opérateur à la fonction Firebird bin_and(a, b)
NHibernate Linq opérateur & registerFunction Firebird
Quelque chose comme ceci:
var result = customers.Where(c => (c.StatusValue & 3) > 0);
La requête ci-dessus se traduira par quelque chose comme ça:
select * from customers where (StatusValue & 3) > 0
ce qui est pas valable dans F irebird, le résultat devrait être:
select * from customers where bin_and(StatusValue,3) > 0
Est-il possible d'écraser ce résultat traduit?
Mise à jour
En déclarant une fonction cela est possible:
[LinqExtensionMethod("BIN_AND")] public static int BinAnd(int a, int b) { return a & b; }
var result = customers.Where(c => BinAnd(c.StatusValue, 3) > 0);
Cela fonctionne, mais je suis à la recherche d'une façon plus générique wizh le ' & 'ou' | ' opérateur ...
Mise à jour:
@ Fédéric:
J'ai écrit ma propre classe Dialect comme ceci:
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"));
}
}
je devais importer les BitwiseFunctionOperation.cs trop
Si je débogue le code, je vois que cette classe est utilisée comme Dialect, et je vois qu'il y a une fonction personnalisée pour « Bande » clé électronique qui a une valeur « bin_and », mais une requête comme celui-ci
var result = customers.Where(c => (c.StatusValue & 3) > 0);
se retrouve dans un sql comme ceci:
select * from customers where (StatusValue & 3) > 0
Je pense que l'analyseur LINQ ne sa part ..
Tout le code Linq requis semble exister depuis NHibernate v3.0 dans le fournisseur Linq intégré. Avez-vous vérifié avec une requête [tag: hql] en utilisant HQL 'band()' qui générait le SQL adéquat? –
Je vais vérifier cela demain et donner une réponse – Franki1986
Ok, j'ai téléchargé le code source et le 'HqlGeneratorExpressionTreeVisitor' n'est jamais appelé. La commande hql ne fonctionne pas, elle est toujours utilisée '&' dans mon sql ... – Franki1986