帕科说的不对。这可以在 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 字段排序,并且出于其他原因也希望DisplayOrder 作为我的FormStructure 对象中的属性。
这基本上意味着我需要加入这些表,以便从 FormStructure 表中检索所有列以及 FormField 表中的 DisplayOrder 列,并将它们加入到匹配的 FieldId 列中。
我做了什么来解决这个问题:
-
我向我的FormStructure 对象添加了一个名为 DisplayOrder 的属性。
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 方法显然会在 Join 中的 KeyColumn 方法中定义的列上的两个表之间连接。
这也将删除一些具有空值的行。为了避免这种情况(我最近遇到了这种情况),您可以在 Join 方法中添加 m.Optional();。
我现在可以检索FormStructure 对象的列表,按DisplayOrder 对它们进行排序,甚至可以将DisplayOrder 用作FormStructure 对象中的属性。
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
这是以前无法做到的,因为它无法识别我在 Order 子句中的 DisplayOrder 列。