2017-08-24 93 views
1

我有一个表Email它有一列EmailTypeEmailType是nHibernate中的一个枚举,并以int形式存储在数据库中。我有扩展方法也得到名称为电子邮件类型:使用EmailType.PasswordReset.Name()如何在nHibernate中枚举列枚举类型的显示名称

我获取电子邮件列表创建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; 
     } 
     } 
    } 
} 

然后我可以得到枚举的名称:

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

问题在于它使用存储在数据库中的EmailType int对行进行排序。有没有什么办法可以使用EmailType.PasswordReset.Name()扩展方法EmailType枚举来枚举枚举的名字?

回答

0

由于您的枚举(在这种情况下)按字母顺序将表示为2,1,0,您可以按相反顺序排列EmailType,这会给你想要的。

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

但是,就像你说的, “这是巧合”。

它不能排序枚举名称的原因是它不知道它们是什么,所以你需要找到一种方法来告诉它。有两个:

一种方法是添加计算字段,将枚举值转换为名称。我已经与其他数据库做了这一点,我相信@Formula是你在Hibernate中使用。

另一种方法是在数据库中创建另一个包含枚举数和枚举值的表。然后链接查询中的两个表,以便返回枚举值。

无论哪种情况,您都可以在新字段上应用排序。

+0

那么这个作品是巧合:)。我在这里给出的这些名字只是少数几个。所有名字不会按字母顺序排列。然后我也有框架来返回不同语言的翻译名称。 –

+0

我会提取数据,然后对其进行排序。 –