位域(可用于一个人对应多个角色,不需要建关联表)

/// <summary>
    /// 参会人角色
    /// </summary>
    [Flags]
    public enum AttendeeRoleEnum
    {
        [Description("所有")]
        All = -1,
        [Description("其他")]
        None = 0,
        [Description("参会人")]
        Registrant = 1,
        [Description("演讲嘉宾")]
        Speaker = 2,
        [Description("随行人员")]
        Guest = 4,
        [Description("作者")]
        Author = 8,
        [Description("普通观众")]
        Purchaser = 16,
        [Description("工作人员")]
        Personnel = 32,
        [Description("评审专家")]
        EssayExpert = 64,

    }

注意:枚举上要加上[Flags]

如果一个人参会人:数据库的值是1,如果是参会人又是评审专家,那值就等于65...

数据库值:

/// <summary>
        /// 参会人角色(这里存的是flags值,查询要用 & 查询)
        /// </summary>
        public int AttendeeRole { get; private set; }

赋值:

/// <summary>
        /// 设置角色 (这里需要在之前的位域前增加角色,不能直接赋值)
        /// </summary>
        /// <param name="role"></param>
        public void SetAttendeeRole(AttendeeRoleEnum role)
        {
            AttendeeRoleEnum flags = (AttendeeRoleEnum)AttendeeRole;
            AttendeeRole = (int)(flags | role);
        }

移除相应的枚举值:

/// <summary>
        /// 清除相关角色 (这里需要在之前的位域前增加角色,先移除,不能直接赋值)
        /// </summary>
        /// <param name="role"></param>
        public void ClearAttendeeRole(List<AttendeeRoleEnum> roleEnums)
        {
            var roleFlags = (AttendeeRoleEnum)AttendeeRole;

            foreach (var item in roleEnums)
            {
                if (roleFlags.HasFlag(item))
                {
                    roleFlags = roleFlags ^ item;
                }
            }

            AttendeeRole = (int)roleFlags;
        }

将值转化为集合:

/// <summary>
        /// 该参会人拥有的角色
        /// </summary>
        public List<AttendeeRoleEnum> AttendeeRoles
        {
            get
            {
                List<AttendeeRoleEnum> roles = new List<AttendeeRoleEnum>();
                var roleFlags = (AttendeeRoleEnum)AttendeeRole;// 比如数据库里的AttendeeRole = 65 ,那么这样得到的值是 Registrant|EssayExpert

                if (roleFlags.HasFlag(AttendeeRoleEnum.Registrant))
                {
                    roles.Add(AttendeeRoleEnum.Registrant);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Speaker))
                {
                    roles.Add(AttendeeRoleEnum.Speaker);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Guest))
                {
                    roles.Add(AttendeeRoleEnum.Guest);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Author))
                {
                    roles.Add(AttendeeRoleEnum.Author);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Purchaser))
                {
                    roles.Add(AttendeeRoleEnum.Purchaser);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.Personnel))
                {
                    roles.Add(AttendeeRoleEnum.Personnel);
                }
                if (roleFlags.HasFlag(AttendeeRoleEnum.EssayExpert))
                {
                    roles.Add(AttendeeRoleEnum.EssayExpert);
                }
                return roles;
            }
        }

mysql中查询:

SELECT    id,attendee_role FROM    attendee WHERE attendee_role&64;

注意:枚举对应的值,放在&后面即可

原文地址:https://www.cnblogs.com/yxzs/p/11196216.html