sqlquery query linq nhibernate

linq - sqlquery - nhibernate sql query string



Compensaciones con el proveedor NHibernate 3.0 QueryOver o LINQ (4)

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 recuerdo exactamente, pero no funciona correctamente con algunas consultas complejas. Parece que es demasiado joven. Y como dice el dlang en la respuesta anterior, es producir un 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 de NH-Linq es que se puede extender, como explicó Fabio Maulo here . Pero similar es posible con QueryOver, pero no tan elegante como con NH-Linq :)

No he encontrado una comparación clara de lo que se admite con NHibernate 3.0 LINQ Provider en comparación con el uso de la sintaxis de QueryOver. Desde la superficie, parece dos grandes esfuerzos en dos cosas muy similares.

¿Cuáles son las principales ventajas de usar cada uno?


He utilizado proveedores de NH-Linq (el antiguo NHContrib para la Versión 2.1, y también el nuevo para NH3.0) y también usé QueryOver. Con toda la experiencia adquirida durante el desarrollo de aplicaciones bastante complejas basadas en datos, le sugiero encarecidamente NO utilizar el proveedor de 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 unir algunas tablas 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. Entonces, si no te importa el rendimiento y ya estás familiarizado con LINQ, entonces ve a NH-Linq. De lo contrario, QueryOver es su amigo confiable y seguro.


LINQ to NHibernate (a partir de la versión 3.0) no admite la propiedad .HasValue en tipos anulables. Uno debe comparar con nulo en las consultas.


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 admite 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 compatibles, ya que cada caso de uso es diferente y algunos funcionan mejor con uno, algunos funcionan mejor con otro.