2010-12-10 12 views
9

Estoy creando una aplicación mvc que utiliza nhibernate y paginación. Tengo una relación de padre e hijo a la que intento cargar mis registros secundarios. Esta todo trabajando bien.nhibernate, carga ansiosa y paginación

El problema que estoy teniendo es con la paginación. Me gustaría tener 15 artículos por página. Esto funciona perfectamente si cada padre tiene solo un hijo. El problema es cuando un padre tiene más de 1 hijo. Por ejemplo, si el padre tiene 2 registros secundarios, entonces la base de datos realmente selecciona 15 registros con dos que representan el mismo padre, uno para cada uno de los dos hijos. Por lo tanto, en mi vista de datos en la página, parece que solo hay 14 registros.

¿Alguien sabe cómo podría obtener el recuento de páginas solo por padre mientras todavía estoy ansioso por cargar las entidades de mi hijo?
Esto va a ser un sitio público, por lo que no creo que sea una buena idea la carga lenta porque causará demasiados viajes al servidor.

¿Hay algo incorporado en NHibernate que pueda manejar esto que me falta?

Gracias por cualquier idea.

Respuesta

0

Necesita utilizar un transformador de resultados de entidad de raíz distinto en su consulta. No ha dicho si está utilizando HQL o Criteria, pero la API es similar para ambos.

// criteria 
criteria.SetResultTransformer(Transformers.DistinctRootEntity) 

Esto obligará al conjunto de resultados a que solo contenga entidades principales distintas.

+2

Uso la entidad de raíz distintiva, pero sigue contando los elementos secundarios múltiples cada vez, no solo contando los elementos primarios distintos. – czuroski

+0

@James Gregory: su sugerencia no funcionará porque la búsqueda se expresa generalmente como SELECCIONAR TOP (@ p0) .... y en caso de que haya una carga ansiosa tiene combinaciones que harán que algunas entidades aparezcan muy por debajo del límite impuesto por TOP. –

1

Puede marcar su propiedad de asociación con fetch="subselect" - esto también asegura que no tenga problemas con un gran producto cartesiano a costa de hacer dos consultas para cada selección.

0

Usar la sugerencia batch-size en su mapeo para la colección de niños es probablemente la mejor/más fácil manera de lidiar con esto. Para mayor discusión, vea mi respuesta a este similar question.

+0

En otras palabras, en lugar de usar la carga ansiosa, esta respuesta sugiere cambiar a la carga lenta con lotes habilitados en cargas perezosas para evitar el problema de rendimiento N + 1. –

Cuestiones relacionadas