2017-08-24 17 views
1

テーブルEmailには、列がEmailTypeです。 EmailTypeは、nHibernateの列挙であり、intとしてDBに格納されます。私は、電子メールの種類の名前を取得するためにも拡張メソッドを持っています。表示名enum型のnHibernateで列挙型列をソートする方法

namespace Email 
{ 
    public enum EmailType : int 
    { 
     PasswordReset = 0, 
     EmailVerification = 1, 
     AccountCreation = 2 
    }; 

    public static class EmailType Extension 
    { 
     public static string Name(this EmailType self) 
     { 
     switch (self) 
     { 
      case EmailType.PasswordReset : 
      return "Password Reset"; 
      case EmailType.EmailVerification : 
      return "Email Verification"; 
      case EmailType.AccountCreation : 
      return "Account Creation"; 
      default: 
      return null; 
     } 
     } 
    } 
} 

その後、私は、私はNHibernateは基準を作成することで、電子メールのリストを取得していますEmailType.PasswordReset.Name()

を使用して列挙型の名前を取得できます。

var criteria = session.CreateCriteria<Email>(); 
criteria.SetFirstResult(startIndex).SetMaxResults(maxResults); 
criteria.AddOrder(Order.Asc("EmailType")); 
return criteria.List<Email>(); 

これは、DBに格納されているEmailType intの行をソートするという問題です。私がEmailType.PasswordReset.Name()の拡張メソッドEmailType列挙型の名前で並べ替えるために使用できる任意の方法はありますか?

答えて

0

アルファベット順の列挙型(この場合)は、2,1,0で表されるため、逆順でEmailTypeを並べることができます。これにより、必要なものが得られます。

criteria.AddOrder(Order.desc("EmailType")); 

しかし、「これは偶然です」

列挙型の名前を並べ替えることができないのは、その列挙型の名前がわからないということです。そのため、その方法を見つける必要があります。次の2つがあります。

1つの方法は、enum値を名前に変換する計算フィールドを追加することです。私は他のデータベースでこれを行いました。@FormulaはHibernateで使っているものです。

もう1つの方法は、データベースに列挙型の数値と列挙型の値を含む別のテーブルを作成することです。クエリ内の2つのテーブルをリンクし、列挙型の値が返されるようにします。

いずれの場合も、新しいフィールドにソートを適用します。

+0

これは偶然によってうまくいく:)。私がここに挙げたこれらの名前はほんのいくつかのものです。すべての名前はアルファベット順ではありません。そして、翻訳された名前を別の言語で返すフレームワークもあります。 –

+0

私はデータを抽出してからソートします。 –

関連する問題