¿Cómo hacer asociaciones de carga con entusiasmo sin duplicación en NHibernate?

Tendría que cargar una lista de objetos muy grandes con tantos hijos e hijos de niños. ¿Cuál es el mejor enfoque para tomar?

Estoy usando la base de datos Oracle 11g y he escrito el siguiente método, pero resulta en un producto cartesiano (resultados duplicados):

public IList GetByEventId(long eventId) { var session = this._sessionFactory.Session; var nominationQuery = session.Query().Where(n => n.Event.Id == eventId); using (var trans = session.Transaction) { trans.Begin(); // this will load the Contacts in one statement nominationQuery .FetchMany(n => n.Contacts) .ToFuture(); // this will load the CustomAttributes in one statement nominationQuery .FetchMany(n => n.CustomAttributes) .ToFuture(); // this will load the nominations but joins those two tables in one statement which results in cartesian product nominationQuery .FetchMany(n => n.CustomAttributes) .FetchMany(n => n.Contacts) .ToFuture(); trans.Commit(); } return nominationQuery.ToList(); } 

La obtención de colecciones es una operación difícil. Tiene muchos efectos secundarios (como se dio cuenta, cuando se obtienen más colecciones) . Pero incluso con recuperar una colección, estamos cargando muchas filas duplicadas.

En general, para la carga de colecciones, sugeriría usar el procesamiento por lotes. Esto ejecutará más consultas SQL … pero no tanto, y lo que es más importante, puede hacer paginación en la lista raíz ARNomination .

Ver: 19.1.5. Usando la búsqueda por lotes puede encontrar más detalles.

batch-szie="25" marcar sus colecciones y / o entidades con un atributo batch-szie="25" .

xml:

  ... 

fluido:

 HasMany(x => x.Contacts) ... .BatchSize(25) 

Por favor, revise algunos argumentos aquí:

Estoy de acuerdo con @ RadimKöhler tan pronto como esté ansioso por cargar más de una colección, entonces siempre ocurre un producto cartesiano. Para seleccionar un tamaño de lote adecuado, entonces probablemente elegiría que sea el mismo que el page size ya que se siente bien … (sin embargo, no hay pruebas de por qué)

Hay otra técnica que puede ser que se ajuste mejor y es leer esta publicación de blog de Ayende que le muestra cómo puede enviar dos consultas futuras al mismo tiempo para cargar múltiples colecciones que el trabajo del alma es cargar cada colección individualmente. .

Sin embargo, cualquiera que sea la ruta que tome, le sugiero que haga un análisis de los resultados para ver cuál funciona mejor para usted …

    Intereting Posts