visual tutorial studio net mvc framework asp c# nhibernate

c# - tutorial - ¿Cuál es la diferencia entre NHibernate Query<> vs QueryOver<>?



nhibernate vs entity framework (2)

Acabo de comenzar con NHibernate (usando SQLite) en mi proyecto actual y principalmente utilicé Query<> , porque estaba familiarizado escribiendo consultas de base de datos en Linq.

Cuando me QueryOver<> algunas consultas más complejas, hice una investigación sobre QueryOver<> y pensé que debería ser favorecida sobre Query<> porque "la sintaxis de QueryOver es específica de NH" . Además, parece que no hay nada que Query<> pueda hacer que QueryOver<> no pueda lograr.

Así que empecé a reemplazar todos los usos de Query<> consecuencia. No pasó mucho tiempo antes de que tuviera el primer "problema" donde usar Query<> parecía más conveniente. Ejemplo (seleccione el valor más alto de la columna CustomNumber en la tabla BillingDataEntity ):

int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault(); int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();

Lo que no me gusta es la necesidad de convertir explícitamente el resultado en int y que la versión Query <> es más fácil de leer. ¿Estoy obteniendo la consulta totalmente incorrecta, o en otras palabras: hay una mejor manera de hacerlo?

Eché un vistazo a la salida SQL generada:

NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1 NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]

¿Qué es exactamente lo que estoy mirando? ¿Es esta la consulta "interna" (dependiente del método) que NHibernate se traduce en la consulta real de la base de datos?


Hay muchas respuestas con respecto a QueryOver versus Query aquí en pero en pocas palabras:

QueryOver es una versión de Criteria fuertemente tipada, y es más específica de NHibernate. Casi todo lo que puede hacer en ICriteria se puede hacer con QueryOver. En los días dorados de ICriteria NH2 siempre tenías que lanzar, de ahí que ahora tengas que lanzar al final de la cadena para volver a un int.

LINQ (consulta) es un método de consulta estándar que funciona en IQueryable que no necesita referencias explícitas a NHibernate y puede considerarse más agnóstico de ORM y, por lo tanto, sigue el estándar de linq. Como ha señalado correctamente, no es necesario convertir a un int, ya que está seleccionando en el resultado el número personalizado.

Me sorprendería mucho su ejemplo simple si el SQL generado fuera muy diferente.

Yo era un gran fanático de QueryOver pero como el proveedor de Linq está madurando, el 95% de mis consultas utilizo Query pero para algunas cosas específicas de Nhibernate QueryOver a QueryOver . De cualquier manera, recomiendo usar una herramienta de perfiles para ver con qué puedes vivir.

Refs: Tradeoffs o versus y versus


Sobre tu versión de QueryOver, habría escrito:

int result = Session.QueryOver<BillingDataEntity>() .Select(Projections.Max<BillingDataEntity>(x => x.CustomNumber)) .SingleOrDefault<int>();

Parece bastante legible, y el SQL resultante sería algo como:

SELECT max(this_.CustomNumber) as y0_ FROM "BillingDataEntity" this_

Espero que esto ayude