我有一个名为Comment
的实体,其enum
属性类型为CommentType
:
public class Comment
{
public virtual Guid Id { get; private set; }
public virtual CommentType CommentType { get; set; }
// other prop removed for simplicity
}
public enum CommentType
{
Comment,
Correction,
Improvement,
BugFix,
NewFeauture,
Other
}
我需要通过alphabetically
枚举的CommentType
值选择数据库中的注释,例如
_db.Comments.OrderBy(p => p.CommentType)
但是,Enum值被视为整数,排序将无法按字母顺序正常工作。
有没有办法在枚举值中添加一些属性/元数据,以便按字母顺序排序?
一种解决方案是将整数值分配给枚举值,但我已经有许多需要更新的数据库记录。此解决方案不适合新添加的枚举值。
public enum CommentType
{
Comment = 2,
Correction = 3,
Improvement = 4,
BugFix = 1,
NewFeauture = 5,
Other = 6
}
答案 0 :(得分:1)
目前你的枚举名称在数据库级别是未知的,所以在我看来你有两个选择。
在服务器端使用值:
_db.Comments.ToList().OrderBy(p => p.CommentType.ToString())
在数据库端添加值:您应该创建包含注释类型名称的表。然后,您可以在注释和commentTypeNames之间创建外键,并使用简单的选择:
_db.Comments.OrderBy(c => c.CommentTypeNames.Name)
或只是加入:
_db.Comments
.Join(
_db.CommentTypeNames,
c => c.CommentType,
ctn => ctn.CommentType,
(c, ctn) => new { Comment = c, CommentName = ctn })
.OrderBy(g => g.CommentName.Name)
.Select(g => g.Comment);
还有计算列。我从来没用过那些,所以我没有经验。也许您可以添加将通过数据库上的CASE语句解析为字符串的列。但是我不确定这将如何影响性能/可维护性。有关详细信息,请查看http://geekswithblogs.net/DavidPaquette/archive/2012/09/23/calculated-columns-in-entity-framework-code-first-migrations.aspx
出于性能原因,我建议采用选项2,最好在数据库中执行此类操作。
我假设您首先使用代码,所以这篇文章可能会对您有所帮助:EF5 Code First Enums and Lookup Tables
答案 1 :(得分:0)
作为替代方案,您可以将CommentType
类中的Comment
属性转换为指向CommentType(Id, Name)
表的外键'CommentTypeId',其中包含您的Id值和相应的文本名称。
这将让您轻松订阅文字。