44 votes

Compromis en utilisant NHibernate 3.0 QueryOver ou le fournisseur LINQ

Je n'ai pas trouvé de comparaison claire de ce qui est pris en charge avec le fournisseur LINQ NHibernate 3.0 par rapport à l'utilisation de la syntaxe QueryOver. En surface, il semble que ce sont deux grands efforts pour deux choses très similaires.

Quels sont les principaux compromis à utiliser chacun?

36voto

Diego Mijelshon Points 40314

LINQ et QueryOver sont des méthodes de requête complètement différentes, qui s'ajoutent à celles qui existaient dans NHibernate 2 (Criteria, HQL, SQL)

QueryOver est conçu comme une version fortement typée de Criteria, et supporte principalement les mêmes concepts, qui sont spécifiques à NHibernate.

LINQ est une méthode de requête "standard", ce qui signifie que le code client peut travailler sur IQueryable sans références explicites à NHibernate. Il prend en charge un ensemble différent de concepts; il serait difficile de dire s'il y en a plus ou moins qu'avec QueryOver.

Ma suggestion est d'apprendre toutes les méthodes de requête prises en charge, car chaque cas d'utilisation est différent et certaines fonctionnent mieux avec l'une, d'autres fonctionnent mieux avec l'autre.

16voto

Daniel Lang Points 4968

J'ai utilisé à la fois les fournisseurs NH-Linq (l'ancien NHContrib pour la version 2.1, et aussi le nouveau pour NH3.0) et j'ai également utilisé QueryOver. Avec toute l'expérience acquise lors du développement d'applications orientées données assez complexes, je suggérerais fortement de NE PAS utiliser le fournisseur linq existant avec nHibernate si vous envisagez d'aller au-delà des opérations CRUD de base!

L'implémentation actuelle (linq) produit parfois un SQL vraiment illisible et inefficace. En particulier, la jointure de certaines tables devient rapidement un cauchemar si vous voulez optimiser les performances de la base de données.

Malgré tous ces inconvénients, je n'ai jamais rencontré de requêtes erronées. Donc, si vous ne vous souciez pas des performances et que vous êtes déjà familier avec LINQ, alors optez pour NH-Linq. Sinon, QueryOver est votre ami fiable et sûr en termes de types.

15voto

Marcel Points 3616

LINQ to NHibernate (à partir de la version 3.0) ne prend pas en charge la propriété .HasValue sur les types Nullable. Il faut comparer à null dans les requêtes.

2voto

vllado2 Points 101

J'ai commencé à utiliser NH-Linq, car j'en avais fini avec LinqToSql et Entity Framework. Cependant, pour des requêtes plus complexes, j'ai toujours fini par utiliser QueryOver. Raisons:

  • Il arrive que les requêtes avec NH-Linq ne fonctionnent pas comme prévu. Je ne me souviens pas exactement, mais cela ne fonctionne pas correctement avec certaines requêtes complexes. Il semble que ce soit trop récent. Et comme dlang l'a indiqué dans la réponse précédente, il produit du SQL inefficace.
  • Lorsque vous apprenez QueryOver, il est facile d'appeler des fonctions, de faire des projections, des sous-requêtes, cela me semble plus facile qu'avec NH-Linq.
  • Bonne chose pour NH-Linq - il peut être étendu, comme l'a expliqué Fabio Maulo ici. Mais, il est tout à fait possible de faire quelque chose de similaire avec QueryOver, mais pas aussi élégant qu'avec NH-Linq :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X