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”。