实体框架按字母顺序按Enum值排序

时间:2014-05-22 06:26:05

标签: asp.net entity-framework sorting enums linq-to-entities

我有一个名为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 
}

2 个答案:

答案 0 :(得分:1)

目前你的枚举名称在数据库级别是未知的,所以在我看来你有两个选择。

  1. 在服务器端使用值:

    _db.Comments.ToList().OrderBy(p => p.CommentType.ToString())
    
  2. 在数据库端添加值:您应该创建包含注释类型名称的表。然后,您可以在注释和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);
    
  3. 还有计算列。我从来没用过那些,所以我没有经验。也许您可以添加将通过数据库上的CASE语句解析为字符串的列。但是我不确定这将如何影响性能/可维护性。有关详细信息,请查看http://geekswithblogs.net/DavidPaquette/archive/2012/09/23/calculated-columns-in-entity-framework-code-first-migrations.aspx

  4. 出于性能原因,我建议采用选项2,最好在数据库中执行此类操作。

    我假设您首先使用代码,所以这篇文章可能会对您有所帮助:EF5 Code First Enums and Lookup Tables

答案 1 :(得分:0)

作为替代方案,您可以将CommentType类中的Comment属性转换为指向CommentType(Id, Name)表的外键'CommentTypeId',其中包含您的Id值和相应的文本名称。

这将让您轻松订阅文字。