如何在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
才能在我的数据库中生成更快的查询
答案 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()