Compromis à l’aide du fournisseur NHibernate 3.0 QueryOver ou LINQ

Je n’ai pas trouvé de comparaison claire de ce qui est pris en charge avec le fournisseur NHibernate 3.0 LINQ par rapport à la syntaxe QueryOver. De la surface, il semble que deux grands efforts se soient faits en deux choses très similaires.

Quels sont les principaux compromis à utiliser?

LINQ et QueryOver sont des méthodes de requête complètement différentes, ajoutées à celles qui existaient dans NHibernate 2 (critères, HQL, SQL)

QueryOver est une version fortement typée des critères et supporte principalement les mêmes constructions, spécifiques à NHibernate.

LINQ est une méthode de requête “standard”, ce qui signifie que le code client peut fonctionner sur IQueryable sans références explicites à NHibernate. Il prend en charge un ensemble différent de constructions; 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 supscopes, chaque cas d’utilisation étant différent et certains fonctionnant mieux avec un autre, certains fonctionnant mieux avec d’autres.

J’ai utilisé à la fois les fournisseurs NH-Linq (l’ancien NHConsortingb pour la version 2.1, et le nouveau pour NH3.0) et j’ai également utilisé QueryOver. Avec toute l’expérience acquise lors du développement d’applications basées sur des données assez complexes, je vous suggère fortement de NE PAS utiliser le fournisseur de linq existant avec nHibernate si vous envisagez de ne faire que des opérations CRUD de base!

L’implémentation actuelle (linq) produit parfois du code SQL réellement illisible et inefficace. Si vous souhaitez optimiser les performances d’une firebase database, rejoindre rapidement certaines tables devient rapidement un cauchemar.

Malgré tous ces inconvénients, je n’ai jamais rencontré de questions erronées. Donc, si vous ne vous souciez pas des performances et que vous connaissez déjà LINQ, alors optez pour NH-Linq. Sinon, QueryOver est votre ami fiable et fiable.

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

J’ai commencé à utiliser NH-Linq, car je l’avais déjà fait avec LinqToSql et Entity Framework. Mais pour les requêtes plus complexes, j’ai toujours fini avec QueryOver. Les raisons:

  • Il arrive que la requête avec NH-Linq ne fonctionne pas comme prévu. Je ne me souviens pas exactement, mais cela ne fonctionne pas correctement avec certaines requêtes complexes. Cela semble trop jeune. Et comme dlang l’a dit dans sa réponse précédente, le SQL est 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.
  • Une bonne chose pour NH-Linq – il peut être étendu, comme l’explique Fabio Maulo ici . Mais, c’est très possible avec QueryOver, mais pas avec NH-Linq 🙂