QueryOver: seleccionar columnas de la subconsulta

¿Cómo puedo seleccionar / proyectar valores de una subconsulta de una tabla diferente en mi consulta principal?

Tengo un modelo NH como este:

[Serializable] public class MyModel { public virtual int Id {get; set;} //more mapped values .... //unmapped values public virtual string ValueFromOtherTable {get;set;} } 

Y quiero llenar ValueFromOtherTable con una combinación a la izquierda como esta:

 Select mt.*, ..., ot.ValueFromOtherTable from MyModelTable mt left join OtherTable ot ON (somecondition) 

donde MyModelTable es la tabla asignada a MyModel-class. Quiero llenar ValueFromOtherTable (no mapeo NH) seleccionando todos los valores de mt (para llenar las columnas mapeadas NH) y luego utilizando OtherTable quiero llenar ValueFromOtherTable.

No puedo unir ambas tablas a través de QueryOver ya que no existe una correlación directa entre padres e hijos en el modelo, por lo que JoinAlias o JoinQueryOver no funcionarán. Mis consultas de MyModelTable .

ALTERNATIVA:

La alternativa es obtener primero todos los valores de MyModelTable y luego usar las propiedades allí para consultar OtherTable. Sin embargo, esto resultará en un problema de SELECT N+1 (para cada modelo de MyModel seleccione alguna otra Tabla de tabla …) y también hace que el código sea muy complicado.

¿Hay una buena manera de resolver este problema o es la única manera de llenar MyModel usando la alternativa descrita?

Una forma sería usar Proyecciones, Subconsultas y DTO. Digamos que tenemos DTO (casi lo mismo que MyModel, pero con una nueva propiedad externa … por ejemplo, Count). Entonces podemos hacerlo así:

 MyModel main = null; MyModelDTO dto = null; // the main query var query = session.QueryOver(() => main); // the subquery used for projection var subquery = QueryOver.Of() // select something, eg count of the ID .SelectList(selectGroup => selectGroup.SelectCount(o => o.ID)) // some condition // kind of JOIN inside of the subquery .Where(o => o.xxx == main.yyy); // just example // now select the properties from main MyModel and one from the subquery query.SelectList(sl => sl .SelectSubQuery(subquery) .WithAlias(() => dto.Count) .Select(() => main.ID) .WithAlias(() => dto .ID) .... ); // we have to use transformer query.TransformUsing(Transformers.AliasToBean()) // and we can get a list of DTO var list = query.List();