在LINQ中获取显示枚举

时间:2016-07-27 21:33:09

标签: c# entity-framework linq entity-framework-6

如何在LINQ查询中获取显示/描述枚举?

例如

 var query = dbo.Records.AsQueryable()
              .Select(x => new
              {
                  Id = x.Id,
                  Care = new
                  {
                      x.StartDate,
                      x.ForwardedBy,
                  },
                  Prescriptions = x.Prescriptions.Select(p => new
                  {
                      p.Medicament,
                      p.IntervalUse //My Enum, how get Display name?
                  }),
              }).OrderByDescending(x => x.Id);

此查询是一个示例,我需要AsQueryable才能在我的数据库中生成更快的查询

4 个答案:

答案 0 :(得分:1)

由于LINQ不知道该扩展方法,您必须先进行枚举,然后使用反射获取属性。

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum value)
    {
        var attribute = (DisplayNameAttribute) value.GetType()
            .GetField(value.ToString())
            .GetCustomAttributes(false)
            .Where(a => a is DisplayNameAttribute)
            .FirstOrDefault();

        return attribute != null ? attribute.DisplayName : value.ToString();
    }
}

我现在无法对此进行测试,但您可以尝试这一点并告诉我们是否有效:

var query = dbo.Records.Include(x => x.Prescriptions).OrderByDescending(x => x.Id).AsEnumerable()
            .Select(x => new
            {
                Id = x.Id,
                Care = new
                {
                    x.StartDate,
                    x.ForwardedBy,
                },
                Prescriptions = x.Prescriptions.Select(p => new
                {
                    p.Medicament,
                    p.IntervalUse.GetDisplayName()
                }),
            });

答案 1 :(得分:0)

我会使用System.Reflection库。

public static GetMyEnumDisplayName(MyEnumType value)
{
    var displayAttribute = value.GetType()
        .GetTypeInfo()
        .GetDeclaredField(result)
        .GetCustomAttribute(typeof(DisplayAttribute));

        if (displayAttribute != null)
        {
            var Name = ((DisplayAttribute)displayAttribute).Name;
        }
}

linq对实体不支持,但您可以在视图模型中将其设为辅助属性。

您的第一步是选择视图模型而不是匿名对象 下一步是在setter中添加一个函数

public string EnumDisplayValue { get { return GetMyEnumDisplayName(MyEnumValue); } } 

答案 2 :(得分:0)

如果你需要经常需要的话,写一个enum扩展方法可能不是一个坏主意:

public static string Describe(this Enum enumVal)
{
    var type = enumVal.GetType();
    var memInfo = type.GetMember(enumVal.ToString());
    var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
    return (attributes.Length > 0) ? ((DescriptionAttribute)(attributes[0])).Description : enumVal.ToString();
}

答案 3 :(得分:0)

为什么你不采用最简单的方式:

public enum IntervalUse
    {
        Hourly,
        Daily,
        Weekly
    }

    public static class EnumExt
    {
        public static string GetDescription(this IntervalUse item)
        {
            switch (item)
            {
                case IntervalUse.Hourly:
                    return "Hour by hour";
                case IntervalUse.Daily:
                    return "Day by day";
                case IntervalUse.Weekly:
                    return "Each week ...";
                default:
                    throw new ArgumentOutOfRangeException(nameof(item), item, null);
            }
        }
    }

然后您可以调用您的查询:p.IntervalUse.GetDescription()