关于C#:如何用数据库ID映射枚举

how to map enum with database id

本问题已经有最佳答案,请猛点这里访问。

我有EnUM:

1
2
3
4
5
6
7
8
9
10
public enum Days
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7
}

我使用这个枚举将值作为int和id插入数据库。但是,当我从数据库中检索值以显示天数名称而不是在我的视图中显示数据库ID时,如何使用该数据库ID"映射"enum Days

例如,我显示了一个数据列表,目前我显示了dayid和id,但是我如何映射这个id来显示枚举文本(星期一、星期二,…)而不是id(1、2、3….)?


您实际上不需要任何特殊的东西,可以将从数据库获得的整数强制转换为枚举:

1
2
int valueFromDB = 4;
Days enumValue = (Days)valueFromDB;


请尝试以下操作。

1
2
3
4
5
6
//Let's say you following ids from the database
 List<int> lstFromDB = new List<int>() { 1, 2, 3 };

 List<string> result = (from int l in lst
                        select ((Days)l).ToString()
                        ).ToList();


使用下面的扩展方法对枚举进行字化

1
2
3
4
5
6
7
8
9
10
11
12
13
/// <summary>
/// Get the whilespace separated values of an enum
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static string ToEnumWordify(this Enum en)
{
    Type type = en.GetType();
    MemberInfo[] memInfo = type.GetMember(en.ToString());
    string pascalCaseString = memInfo[0].Name;
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
    return r.Replace(pascalCaseString," ${x}");
}

或者您可以提供描述来枚举使用下面的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public enum Manufacturer
{
    [DescriptionAttribute("I did")]
    Idid = 1,
    [DescriptionAttribute("Another company or person")]
    AnotherCompanyOrPerson = 2
}

/// <summary>
/// Get the enum description value
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static string ToEnumDescription(this Enum en) //ext method
{
    Type type = en.GetType();
    MemberInfo[] memInfo = type.GetMember(en.ToString());
    if (memInfo != null && memInfo.Length > 0)
    {
        object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        if (attrs != null && attrs.Length > 0)
            return ((DescriptionAttribute)attrs[0]).Description;
    }
    return en.ToString();
}

您只需使用Enum.ToObject(typeof(Days), item)以下的扩展方法就可以了。

1
2
3
4
5
6
7
8
9
10
11
private List<string> ConvertIntToString(Enum days, params int[]  daysIds)
{
    List<string> stringList = new List<string>();

    foreach (var item in daysIds)
    {
        stringList.Add(Enum.ToObject(days.GetType(), item).ToString());
    }

    return stringList;
}

用途如下:

1
ConvertIntToString(new Days(),2, 4, 6, 1);

1
2
3
4
5
6
7
8
9
        private List<Enum> ConvertIntToString(params int[] daysIds)
        {
            List<Enum> EnumList = new List<Enum>();
            foreach (var item in daysIds)
            {
                EnumList.Add((Days)item);
            }
            return EnumList;
        }

我不建议采用这种方法。你需要一张几天的查找表。例如

1
2
3
create table Days(
 DaysID INT PRIMARY KEY,
 Name VARCHAR(20))

所有其他表都将具有daysid的外键列。我反对你的方法的原因是因为你把自己限制在可能改变的硬编码值上。

如果需要,您可以将您的日表加载到List>中。如果您按原样离开,那么查看数据库的任何人都不会知道daysid 1、2、3、4等表示的方式。

我希望这有帮助。