パコが言ったことは正しくありません。これは、FluentNHibernateで実行できます。私はかなり長い間自分でウェブを検索しましたが、このオプションについて話している人を見つけることができなかったので、FNHibernateを少し遊んで、ようやくそれを行うことができました。
これが私のシナリオでした:
私は2つのテーブルを持っています-
"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
メソッドは、Join内のKeyColumnメソッドで定義した列の2つのテーブル間で明らかに結合します。
これにより、null値を持つ行の一部も削除されます。これを回避するために(最近これに遭遇しました) 、メソッドm.Optional();
内に追加できます。Join
これで、オブジェクトのリストを取得し、FormStructure
それらを並べ替えてDisplayOrder
、オブジェクトDisplayOrder
のプロパティとして使用できるようになりましたFormStructure
。
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
DisplayOrder
私が持っているOrder句の列を認識していなかったため、これは以前は実行できませんでした。