Pregunta

Si tengo entidad Order con una lista de OrderDetails que pueda cargar fácilmente y con ganas el detalle junto con la orden mediante el uso de NHibernateUtil.Initialize (Order.Details). Así que, obviamente, el NHibernate tiene toda la información para generar la instrucción SQL. Pero ¿cómo consultar la base de datos para sólo los detalles (similar a CreateSourceQuery en Entity Framework) sin crear manualmente un criterio? ¿Hay algo así como NHibernateUtil.GetList (Order.Details)?

Actualización: Utilizar el servicio de Darin esto lo que finalmente terminó con. Esto es lo suficientemente genérico como puedo ponerlo en práctica en la clase base de la entidad

Dim entity as EntityBase
Dim queryString = String.Format("select entityAlias.{1} from {0} entityAlias where entityAlias.id = :ID", entity.GetType.Name, collectionPropertyName)
Dim query = Session.CreateQuery(queryString).SetParameter("ID", entity.ID)
Return query.List
¿Fue útil?

Solución

NHibernate ha construido en un método para hacer exactamente lo que pienso que usted está pidiendo. (ISession.CreateFilter)

Por ejemplo, si tiene una entidad cliente cargado el nombre del cliente que tiene una colección de Pedidos Pedidos con nombre, puede cargar las órdenes al hacer esto.

var orderQuery = session.CreateFilter(customer.Orders, string.Empty);  
var orders = orderQuery.List<Order>();

Este es equivilant a la siguiente, sólo un poco más limpio.

var orderQuery = session.CreateQuery("from orders o where o.Customer.id = :customerId")
                        .SetParameter("customerId", customer.Id);
var orders = orderQuery.List<Order>();

Si desea filtrar la colección, una cláusula de HQL donde se puede pasar como el segundo argumento de ISession.CreateFilter(object, string)

Otros consejos

¿Por qué no cargar la Orden y acceder a su colección de detalles? Si usted fuera capaz de simplemente cargar la colección, usted no será capaz de añadir a la colección ya que se requiere una orden para la relación.

Creo que está haciendo un mal uso NHibernateUtil.Initialize. Su propósito es forzar la inicialización de una colección de proxy (cargado ligeramente) en casos especiales. loading Eager es lo contrario de lazy-loading; en ese escenario la colección siempre sería cargado con su objeto padre y no habría necesidad de un proxy. Si ya tiene el objeto para luego acceder a la colección Detalles hará que se va a cargar. Si quieres ansiosos traes puede establecer que en las opciones de asignación.

La forma recomendada de consulta de objetos en NHibernate está usando ya sea el Criterios API o HQL . ¿Tiene alguna razón en contra de cualquiera de estos dos enfoques?

var details = session.CreateCriteria<OrderDetails>().List<OrderDetails>();
var details = session.CreateQuery("from OrderDetails").List<OrderDetails>();

ACTUALIZACIÓN:

Si desea cargar sólo la asociación sin cargar el objeto padre podría utilizar la siguiente consulta:

var details = session.CreateQuery(
        "select " + 
        "  orderDetail" + 
        "from " + 
        "  Order order," + 
        "  OrderDetail orderDetail " + 
        "where " + 
        "  orderDetail in elements(order.Details)"
    )
    .List<OrderDetail>();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top