C# 如何使用枚举类型的显示名称对nHibernate中的枚举列进行排序

C# 如何使用枚举类型的显示名称对nHibernate中的枚举列进行排序,c#,.net,nhibernate,C#,.net,Nhibernate,我有一个表Email,其中有一列EmailTypeEmailType是nHibernate中的枚举,在DB中存储为int。我还有扩展方法来获取电子邮件类型的名称: namespace Email { public enum EmailType : int { PasswordReset = 0, EmailVerification = 1, AccountCreation = 2 }; public static

我有一个表
Email
,其中有一列
EmailType
EmailType
是nHibernate中的枚举,在DB中存储为int。我还有扩展方法来获取电子邮件类型的名称:

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;
        }
      }
    }
}
然后我可以使用
EmailType.PasswordReset.name()

我通过创建nHibernate标准获取电子邮件列表:

var criteria = session.CreateCriteria<Email>();
criteria.SetFirstResult(startIndex).SetMaxResults(maxResults);
criteria.AddOrder(Order.Asc("EmailType"));
return criteria.List<Email>();
var-criteria=session.CreateCriteria();
标准.SetFirstResult(startIndex).SetMaxResults(maxResults);
标准.AddOrder(Order.Asc(“EmailType”));
返回条件。List();
问题是它使用存储在DB中的EmailType int对行进行排序。有什么方法可以使用
EmailType.PasswordReset.Name()
EmailTypeenum的扩展方法来使用enum的名称进行排序吗?

由于您的enum(在本例中)按字母顺序由2、1、0表示,您可以按相反的顺序对EmailType进行排序,这将为您提供所需的内容

criteria.AddOrder(Order.desc("EmailType"));
然而,正如你所说,“这是一个巧合”

它无法对枚举名称进行排序的原因是它不知道它们是什么,因此需要找到一种方法来告诉它。有两种:

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

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

在任何一种情况下,您都可以对新字段应用排序。

由于您的枚举(在本例中)按字母顺序由2、1、0表示,因此您可以按相反的顺序排列EmailType,这将为您提供所需的内容

criteria.AddOrder(Order.desc("EmailType"));
然而,正如你所说,“这是一个巧合”

它无法对枚举名称进行排序的原因是它不知道它们是什么,因此需要找到一种方法来告诉它。有两种:

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

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


在这两种情况下,您都可以对新字段应用排序。

我面临同样的问题,我找到了一种使用投影的方法

QueryOver<TRoot, TSubType>.OrderBy(IProjection projection)
QueryOver.OrderBy(IProjection投影)

queryOver
.OrderBy(GetOrderByEnumProjection(x=>x.EnumProperty,GetAllMyEnumValuesOrderByDisplayName(CultureInfo.CurrentCulture));
私有静态IProjection GetOrderByEnumProjection(表达式enumProperty,IReadOnlyList enumValues)
其中TEnum:Enum
{
int index=enumValues.Count-1;
TEnum enumValue=enumValue[索引];
IProjection-elseProjection=GetConditional(enumProperty、enumValue、index、Projections.Constant(-1));
对于(index=enumValues.Count-2;index>=0;index--)
{
枚举值=枚举值[索引];
elseProjection=GetConditional(enumProperty、enumValue、index、elseProjection);
}
返回elseProjection;
}
私有静态IProjection GetConditional(表达式enumProperty、TEnum值、int-sortIndex、IProjection-elseProjection)
其中TEnum:Enum
{
返回预测。有条件的(
限制.Eq(投影.属性(枚举属性)、值),
投影常数(sortIndex),
elseProjection);
}

(在这里,您可以找到有关结果SQL的详细信息:)

我也遇到了同样的问题,我找到了一种使用投影的方法

QueryOver<TRoot, TSubType>.OrderBy(IProjection projection)
QueryOver.OrderBy(IProjection投影)

queryOver
.OrderBy(GetOrderByEnumProjection(x=>x.EnumProperty,GetAllMyEnumValuesOrderByDisplayName(CultureInfo.CurrentCulture));
私有静态IProjection GetOrderByEnumProjection(表达式enumProperty,IReadOnlyList enumValues)
其中TEnum:Enum
{
int index=enumValues.Count-1;
TEnum enumValue=enumValue[索引];
IProjection-elseProjection=GetConditional(enumProperty、enumValue、index、Projections.Constant(-1));
对于(index=enumValues.Count-2;index>=0;index--)
{
枚举值=枚举值[索引];
elseProjection=GetConditional(enumProperty、enumValue、index、elseProjection);
}
返回elseProjection;
}
私有静态IProjection GetConditional(表达式enumProperty、TEnum值、int-sortIndex、IProjection-elseProjection)
其中TEnum:Enum
{
返回预测。有条件的(
限制.Eq(投影.属性(枚举属性)、值),
投影常数(sortIndex),
elseProjection);
}

(在这里,您可以找到有关结果SQL的详细信息:)

这是巧合:)。我在这里给出的这些名字只是少数几个。所有的名字不会按字母顺序排列。然后我还有一个框架来返回不同语言的翻译名称。我会提取数据,然后对其进行排序。这是巧合:)。我在这里给出的这些名字只是少数几个。所有的名字不会按字母顺序排列。然后,我还有一个框架,可以返回不同语言的翻译名称。我会提取数据,然后对其进行排序。结果证明,条件的嵌套不能无休止地进行。在MsSql中,支持19。SqlLite甚至更少。需要找到一种方法使NH使用“case”当this..Name='a'时,然后1当this..Name='B'时,然后2当this..Name='C'时,然后3[…]否则0”。事实证明,条件的嵌套不能无休止地完成。在MsSql中,支持19。SqlLite甚至更少。需要找到一种方法使NH使用“当this..Name='a'时为1,当this..Name='B'时为1,当this..Name='C'时为2,然后为3[…]否则为0”。