Lo que Paco dijo no es correcto. Esto se puede hacer en Fluent NHibernate. Busqué en la web por un tiempo, no pude encontrar a nadie hablando sobre esta opción, así que solo jugué un poco con FNHibernate y finalmente logré hacerlo.
Esta era mi escenario:
Tengo dos tablas -
"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" }
"FormStructure" => Columns { "FormId", "FormType", "FieldId" }
Estas fueron mis Entidades:
public class FormStructure
{
public virtual Int32 FormId { get; private set; }
public virtual Int32 FormType { get; set; }
public virtual FormField FieldId { get; set; }
}
public class FormField
{
public virtual int FieldId { get; private set; }
public virtual String FieldName { get; set; }
public virtual int? FieldType { get; set; }
public virtual int? DisplayOrder { get; set; }
}
que tengo un par de métodos en mi consulta que devuelve una lista de FormStructure
objetos. Quería que estos métodos me los dieran ordenados por el campo DisplayOrder
en el objeto FormField
, y quería el DisplayOrder
disponible como una propiedad en mi objeto FormStructure
por otras razones también.
Esto significa básicamente que necesitaba para unir las tablas de modo que iba a recuperar todas las columnas de la tabla FormStructure junto con la columna de DisplayOrder
de la mesa FormField
, uniéndose a ellos en los que emparejan FieldId
columnas.
Lo que hice para resolver esto:
que añade una propiedad llamada a mi DisplayOrder objeto FormStructure
.
public virtual int? DisplayOrder { get; set; }
he añadido el método Join
a mi clase de mapeo FormStructure
por lo que se veía así.
public class FormStructureMap : ClassMap<FormStructure>
{
public FormStructureMap()
{
Table("FormStructure");
Id(x => x.Id);
Map(x => x.FormType);
References(x => x.Schedule).Column("ScheduleId");
References(x => x.Field).Column("FieldId");
Map(x => x.IsMandatory).Nullable();
Join("FormFields", m =>
{
m.Fetch.Join();
m.KeyColumn("FieldId");
m.Map(t => t.DisplayOrder).Nullable();
});
}
}
El método Join
obviamente unión entre las dos mesas en la columna que definió en el método KeyColumn dentro de la unión.
Esto también eliminará algunas de las filas que tienen valores nulos. Para evitar esto (me encontré con esto recientemente) puede agregar m.Optional();
dentro del método Join
.
ahora podía recuperar una lista de FormStructure
objetos, ordenarlos por DisplayOrder
e incluso tienen DisplayOrder
disponible como una propiedad del objeto FormStructure
.
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
Esto no se podría haber hecho antes, porque no habría reconocido la columna de la DisplayOrder
en la cláusula Solicitar tengo allí.
Interesante, sin embargo, la documentación sobre el método Join() con una asignación de Subclase dice que para el segundo argumento de Acción unirse() -> "esto solo funciona si estás en una estrategia de jerarquía de tabla por herencia. – PandaWood