我们曾经将我们的 Enum 存储在一个数据库表中,该表具有Code与应用程序中的 Enum 对应的属性。这样做的重点是我们可以为数据库中的 Enum 提供一个友好的名称,以便我们在需要时可以轻松访问它。
最近,我们不再在数据库中使用 Enum 表,而是在每个 Enum 上使用 Description 属性,并使用反射将 Description 作为友好名称。这很棒,因为这意味着我们数据库中的表更少。
下面是Description扩展方法:
public static string Description(this Enum source)
{
var field = source.GetType().GetField(source.ToString());
var attributes = (DescriptionAttribute[])field.GetCustomAttributes(
typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : source.ToString();
}
现在,我Select在 DatabaseContext 上执行 Linq语句时遇到了问题(我需要将其保留为IQueryable),我们无法使用 Enum 上的扩展方法来获取友好名称,因为实体框架无法识别方法。
当前代码如下所示。的ItemPriority被分配,它使用反射的Enumn描述属性。此代码失败,因为 EF 无法识别该方法。
return await OrderItems(items).Skip(pageIndex * pageSize).Take(pageSize)
.Select(item => new ItemViewModel
{
Id = item.Id,
Description = item.Description,
ItemPriority = item.Priority.Description(),
}).ToListAsync();
有没有另一种方法可以将友好名称应用于枚举,或者在数据库中使用友好名称是唯一的方法?如果我使用数据库,我可以执行以下操作:
return await OrderItems(items).Skip(pageIndex * pageSize).Take(pageSize)
.Select(item => new ItemViewModel
{
Id = item.Id,
Description = item.Description,
ItemPriority = item.Priority.Name,
}).ToListAsync();
牧羊人nacy
相关分类