0

次のような列挙型として定義されているステータスタイプを含むクラスがあるとします。

    public class MyObject
    {
        public virtual int Id { get; set; }
        public virtual SomeEntity Data { get; set; }
        public virtual MyStatusEnum Status { get; set; }
    }

    public enum MyStatusEnum
    {
        Active = 1,
        Paused = 2,
        Completed = 3
    }

FluentnHibernateを介して行われたマッピングは次のようになります。

    public class MyObjectMap: ClassMap<MyObject>
    {
        public MyObjectMap()
        {
            this.Table("my_object_table");
            ...
            this.References(x => x.SomeEntity).Column("some_entity_id").Not.Nullable();
            this.Map(x => x.Status).Column("status_type").CustomType<MyStatusEnum>().Not.Nullable();
        }
    }

セットアップが邪魔になったので、私のジレンマ:

私のリポジトリクラスでは、すべてのMyObjectエンティティをStatusプロパティで並べ替えたいと考えています。これは、nHibernateがintとして保持されます。ただし、制御できない能力のため、列挙値がアルファベット順に並べられるようにMyStatusEnumを並べ替えることはできません。MyObjectsのリストを選択するための条件を作成し、それをStatusプロパティで並べ替えようとすると、Statusのint値で並べ替えられます。

    ICriteria criteria = this.Session.CreateCriteria<MyObject>("obj")
        .AddOrder(Order.Asc("Status"))
        .List()

列挙型の名前で注文できるようにしたいと思います。任意のアイデアをいただければ幸いです。

4

2 に答える 2

1

データベースでソートしたい場合はcase文でプロジェクションでソートする必要がありますが、これではインデックスが使えず、NHibernateのバージョンによっては動作しない場合があります(バグあり)選択にないプロジェクションでソートする場合)。

このようなものがうまくいくかもしれません:

.AddOrder(Order.Asc(
            Projections.SqlProjection(
                 "CASE {alias}.Status "
                     + "WHEN 1 THEN 0 "
                     + "WHEN 2 THEN 3 "
                     + "WHEN 3 THEN 2 END", 
                  new string[0], new IType[0])))

別のオプション (パフォーマンスの向上) は、StatusOrder などのクラスにプロパティを追加することです。これは、列挙型の現在のステータスの相対位置に等しく設定し、そのフィールド (インデックスを作成できます) で並べ替えるだけです。

さらに別のオプションとして、ステータスに応じて並べ替える値を式で指定する、クラスで式プロパティを定義する (つまり、マッピングで式を指定する) こともできます。

于 2012-06-15T15:47:32.197 に答える
0

簡単な方法は、列挙型を単純にリファクタリングして、値と名前の順序が同じになるようにすることです。

public enum MyStatusEnum
{
    Active = 1,
    Paused = 3,
    Completed = 2
}

ただし、いつでもList.Sort メソッドを使用してジョブを実行できます。

enum MyEnum
{
    Alpha,
    Beta,
    Gama
}

static void Main(string[] args)
{
    List<MyEnum> list = new List<MyEnum>()
    {
        MyEnum.Gama,
        MyEnum.Beta,
        MyEnum.Alpha
    };

    list.Sort((x, y) => x.ToString().CompareTo(y.ToString()));
}

NHibernate は、結果セットがデータベースに格納されている方法に基づいて並べ替えます。あなたが言ったことから、列挙型は整数として格納されていると推測しているため、これらの名前は SQL Server では認識されないため、SQL Server に名前で並べ替えるように依頼することはできません。

この SO Questionで説明されているように、列挙型を文字列として保存しない限り、唯一のオプションは、データベースではなく「メモリ内」で順序付けを実行することです。

于 2012-06-14T00:37:43.983 に答える