Ventajas y desventajas usando el proveedor NHibernate 3.0 QueryOver o LINQ


No he encontrado una comparación clara de lo que es compatible con el proveedor NHibernate 3.0 LINQ en comparación con el uso de la sintaxis QueryOver. Desde la superficie, parecen dos grandes esfuerzos en dos cosas muy similares.

¿Cuáles son las compensaciones clave para usar cada uno?

Author: dotjosh, 2010-10-06

4 answers

LINQ y QueryOver son métodos de consulta completamente diferentes, que se agregan a los que existían en NHibernate 2 (Criteria, HQL, SQL)

QueryOver se entiende como una versión fuertemente tipada de Criteria, y soporta principalmente las mismas construcciones, que son específicas de NHibernate.

LINQ es un método de consulta "estándar", lo que significa que el código del cliente puede funcionar en IQueryable sin referencias explícitas a NHibernate. Es compatible con un conjunto diferente de construcciones; sería difícil decir si hay más o menos que con QueryOver.

Mi sugerencia es aprender todos los métodos de consulta soportados, ya que cada caso de uso es diferente y algunos funcionan mejor con uno, algunos funcionan mejor con otros.

 36
Author: Diego Mijelshon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 16:18:42

He usado ambos NH-Linq-providers (el antiguo NHContrib para la Versión 2.1, y también el nuevo para NH3.0) y también he usado QueryOver. Con toda la experiencia adquirida durante el desarrollo de aplicaciones basadas en datos bastante complejas, le sugiero encarecidamente que NO utilice el proveedor linq existente con NHibernate si planea ir detrás de las operaciones básicas de CRUD.

La implementación actual (linq) a veces produce SQL realmente ilegible y también ineficiente. Especialmente unirse a algunas mesas rápidamente se convierte en una pesadilla si desea optimizar el rendimiento de la base de datos.

A pesar de todos estos inconvenientes, nunca encontré consultas incorrectas. Así que si no te importa el rendimiento y ya estás familiarizado con LINQ, entonces ve por NH-Linq. De lo contrario, QueryOver es tu amigo realiable y seguro.

 16
Author: Daniel Lang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 18:28:04

LINQ to NHibernate (a partir de la versión 3.0) no soporta .La propiedad HasValue en tipos Nullables. Se debe comparar con null en las consultas.

 15
Author: Marcel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-29 15:07:27

Empecé a usar NH-Linq, porque ya había terminado con LinqToSql y Entity Framework. Pero, para consultas más complejas, siempre he terminado con QueryOver. Razones:

  • Sucede que la consulta con NH-Linq no funciona como se esperaba. No puedo recordar exactamente, pero no funciona correctamente con algunas consultas complejas. Parece que es demasiado joven. Y como dlang declaró en la respuesta anterior, es producir SQL ineficiente.
  • Cuando aprendes QueryOver, es fácil llamar a funciones, hacer proyecciones, subconsultas, me parece más fácil que con NH-Linq.
  • Lo bueno para NH-Linq - se puede extender, como Fabio Maulo explicó aquí. Pero, similar es bastante posible con QueryOver, pero no tan elegante como con NH-Linq:)
 2
Author: vllado2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-12 15:52:01