2017-05-10 4 views
3

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 ..

+0

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? –

+0

Je vais vérifier cela demain et donner une réponse – Franki1986

+0

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

Répondre

1

Utilisez-vous le dialecte approprié? FirebirdDialect définit correctement bitwise et HQL (RegisterFunction("band", new BitwiseFunctionOperation("bin_and")); et traduit & (ExpressionType.And) au appropriate HQL call.

Si vous utilisez une ancienne version NHibernate, vous devez peut-être mettre à niveau.

opérateurs Firebird au niveau du bit ont été ajoutés avec Vous pouvez essayer de les rediriger dans votre projet en utilisant un dialecte personnalisé dérivé de FirebirdDialect et en enregistrant ces fonctions supplémentaires comme illustré dans le lien ci-dessus, au sein de votre construction de dialecte personnalisé. tor.

Mais cela ne fonctionnera pas, car il nécessite un autre changes dans les internes de NHibernate, pas disponible avant NHibernate 4.1. Peut-être qu'en corrigeant une copie locale des sources de NHibernate 3.4, vous réussirez à le faire.

+0

Ahh Frédéric, quelle surprise :-) J'utilise Nhibernate 3.4, c'est la dernière version qui supporte .Net 3.5. Le résultat des clients. Où (c => (c.StatusValue & 3)> 0) ne se transforme pas dans le 'bin_and' désiré – Franki1986

+0

Voir ma modification. Bien sûr, il serait préférable de mettre à jour votre cadre d'application. 3.5 approche de sa fin de support. –