帕科说的不对。这可以在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
对象列表。我希望这些方法按照
FormField
对象中的
DisplayOrder
字段排序,并且希望在我的
FormStructure
对象中提供
DisplayOrder
属性以便其他用途。
这基本上意味着我需要连接这些表,以便从FormField
表中检索出DisplayOrder
列以及来自FormStructure
表的所有列,并将它们加入到匹配的FieldId
列上。
我解决这个问题的方法:
I added a property called DisplayOrder to my FormStructure
object.
public virtual int? DisplayOrder { get; set; }
I added the Join
method to my FormStructure
mapping class so it looked like this.
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
方法中定义的列明确地连接两个表格。这还将删除一些具有 null 值的行。为了避免这种情况(我最近遇到过),您可以在
Join
方法中添加
m.Optional();
。
现在,我可以检索
FormStructure
对象列表,按
DisplayOrder
排序,甚至可以将
DisplayOrder
作为
FormStructure
对象的属性。
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
以前无法完成这个操作,因为它不能识别我在订单子句中的DisplayOrder
列。