2009-08-25 8 views
1

Est-ce que quelqu'un connaît une solution existante pour traduire une instruction LINQ Expression en HQL?Est-ce que quelqu'un sait comment traduire l'expression LINQ à l'instruction NHibernate HQL?

Merci d'avance à tous les bons samaritains là-bas.

P.S.

Nous utilisons déjà Linq pour NHibernate. Cependant, cela ne fonctionne que pour les instructions select, alors que HQL est bon pour d'autres types d'instructions, comme delete. Linq to NHibernate n'est donc pas la solution.

+0

Dupliquer: http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco

+1

Pas tout à fait. J'ai également remarqué cette question et même répondu. – mark

Répondre

2

Linq à nhibernate vient d'être released. Est ce que ça aide?

+0

Je l'utilise déjà. Il ne peut faire que des sélections, alors que HQL peut être utilisé dans d'autres opérations, comme supprimer. Donc non, ça n'aide pas. – mark

+0

oh ok. vous suggérons de modifier votre question, le cas échéant. –

0

Utilisez LINQ pour l'interrogation, HQL pour la suppression et la mise à jour. Même les critères peuvent toujours être utiles au lieu de LINQ.

Ce n'est pas une situation de/ou, vous pouvez et devez choisir le meilleur outil pour chaque travail.

+0

HQL est spécifique à NHibernate et en tant que tel est le détail de l'implémentation DAL côté serveur. Je ne veux pas qu'il "fuit" du côté du client, qui est celui qui demande la suppression de certaines entités. Ainsi, le client spécifie une expression linq. Quand la requête est fetch - simple, parce qu'il y a linq à nhibernate, qui la traduit en critères et la sélectionne ensuite. Cependant, il n'y a pas de déclaration de suppression par critère et c'est un problème. – mark

+1

C'est une autre question tout à fait ... s'il vous plaît créer une autre question pour y remédier. Lorsque vous utilisez plusieurs niveaux IMO, vous ne devez pas autoriser un client à envoyer sa propre expression linq. –

+0

http://stackoverflow.com/questions/1330432/in-a-multitier-application-should-a-client-be-allowed-to-send-its-own-linq-expres – mark

1

J'avais le même besoin: j'avais besoin de supprimer en utilisant une expression LINQ, mais NHibernate ne supporte que la suppression en utilisant HQL ou SQL. Je n'aime pas cette approche, car le reste du code est complètement typé avec l'expression LINQ, et je devais ensuite établir un lien avec les noms de tables et de propriétés et manipuler les chaînes.

Je travaille avec NHibernate 3.0 et je suis arrivé à 95% du chemin, mais j'ai dû utiliser la réflexion pour appeler certaines méthodes privées/internes sur le chemin. Le dessous me donne un objet HqlQuery pour l'expression LINQ:

NhQueryable<Product> queryable = (from p in session.Query<Product>() 
          where p.ProductId == 1 
          select p) as NhQueryable<Product>; 
      if (queryable != null) 
      { 
       Expression expression = queryable.Expression; 
       NhQueryProvider provider = queryable.Provider as NhQueryProvider; 
       MethodInfo prepareQueryMethod = typeof(NhQueryProvider).GetMethod("PrepareQuery", BindingFlags.Instance | BindingFlags.NonPublic); 
       object[] arguments = new object[] {expression, null, null}; 
       NhLinqExpression nhLinqExpression = prepareQueryMethod.Invoke(provider, arguments) as NhLinqExpression; 
       ExpressionToHqlTranslationResults translationResults = nhLinqExpression.ExpressionToHqlTranslationResults; 
       HqlQuery hql = translationResults.Statement as HqlQuery; 
      } 

Je suis coincé sur que je ne suis pas en mesure de convertir l'objet HqlQuery à une chaîne HQL. Quelqu'un a-t-il des commentaires à ce sujet? Ou avez-vous résolu votre problème d'une manière différente?

Quoi qu'il en soit, je pense que cela pourrait être un excellent ajout d'avoir une surcharge de ISession.Delete, qui a pris un IQueryable ou IQuery en paramètre. Je suis un débutant pour NHibernate, mais il me semble que ce devrait être une tâche assez simple pour quelqu'un qui sait NHibernate de trouver des méthodes déjà existantes et de les connecter pour faire le travail.

+0

Je me suis permis de republier votre résultats sur la liste de diffusion NH dédiée. Il y a du trafic autour de ce post - votre action est requise. L'URL du message est http://groups.google.com/group/nhusers/browse_thread/thread/07cff495aa5f12e1 – mark