То, что сказал Пако, неверно. Это можно сделать в Fluent NHibernate.
Я сам некоторое время искал в Интернете, не мог найти никого, кто бы говорил об этой опции, поэтому я просто немного поиграл с FNHibernate и, наконец, смог это сделать.
Это был мой сценарий:
У меня есть две таблицы -
"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" }
"FormStructure" => Columns { "FormId", "FormType", "FieldId" }
Это были мои сущности:
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; }
}
В моем запросе есть несколько методов, которые возвращают список FormStructure
объектов. Я хотел, чтобы эти методы упорядочивали их по полю DisplayOrder
в объекте FormField
, и хотел, чтобы DisplayOrder
был доступен как свойство в моем FormStructure
объекте и по другим причинам.
Это в основном означает, что мне нужно было объединить таблицы, чтобы я мог извлечь все столбцы из таблицы FormStructure вместе со столбцом DisplayOrder
из таблицы FormField
, соединив их в соответствующих столбцах FieldId
.
Что я сделал, чтобы решить эту проблему:
Я добавил свойство DisplayOrder в свой FormStructure
объект.
public virtual int? DisplayOrder { get; set; }
Я добавил метод Join
в свой класс отображения FormStructure
, чтобы он выглядел следующим образом.
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();
});
}
}
Метод Join
очевидно объединит две таблицы в столбце, который вы определили в методе KeyColumn в Join.
Это также удалит некоторые строки, имеющие нулевые значения. Чтобы избежать этого (я столкнулся с этим недавно), вы можете добавить m.Optional();
в метод Join
.
Теперь я могу получить список FormStructure
объектов, упорядочить их по DisplayOrder
и даже иметь DisplayOrder
в качестве свойства объекта FormStructure
.
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
Этого нельзя было сделать раньше, потому что он не распознал бы столбец DisplayOrder
в предложении Order, которое у меня там есть.