You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带Flags特性的WeekDays枚举:前端列表转数据库存储整数的实现问题

正确实现Flags枚举列表转整数存储的方法

你的代码存在几个关键问题需要修正:

  • daysBit未初始化,默认会是随机垃圾值,必须初始化为0(对应WeekDays.None)
  • 强制转换语法错误:(day)WeekDays写法错误,正确转换应为(int)day
  • 变量名不一致:你定义了settings但判断的是adminEmailSettingsFromDb,会导致编译错误

修正后的核心实现代码

// 初始化位掩码为0(对应WeekDays.None)
int daysBit = 0;
var settings = await _globalContext.settingsModel.SingleOrDefaultAsync(x => x.id == request.id);

if (settings == null)
{
    foreach (var day in request.DaysOfWeek)
    {
        // 将每个枚举值转为整数后按位或,累加位掩码
        daysBit |= (int)day;
    }

    var newSettings = new settingsModel
    {
        DaysOfWeek = daysBit,
        CreatedAt = DateTime.UtcNow,
        UpdatedAt = DateTime.UtcNow
    };

    _globalContext.settingsModel.Add(newSettings);
    await _globalContext.SaveChangesAsync();
}

更简洁的写法(用LINQ)

如果不想写foreach,可以用LINQ的Aggregate方法一步完成位掩码累加:

int daysBit = request.DaysOfWeek.Aggregate(0, (acc, day) => acc | (int)day);

补充:从数据库读取整数转回枚举列表

后续需要读取展示时,可将存储的整数转回WeekDays枚举并拆分为列表:

// 从数据库读取存储的整数值
int storedDays = settings.DaysOfWeek;
// 转为WeekDays枚举类型
WeekDays selectedDays = (WeekDays)storedDays;
// 拆分出被选中的枚举项列表
List<WeekDays> daysList = Enum.GetValues(typeof(WeekDays))
                              .Cast<WeekDays>()
                              .Where(day => day != WeekDays.None && selectedDays.HasFlag(day))
                              .ToList();

注意事项

  • 数据库中DaysOfWeek字段类型要匹配:用int即可(当前枚举最大值为64,int完全覆盖;若后续扩展更大值可改用long)
  • 前端传参时要确保request.DaysOfWeek是WeekDays类型的枚举列表,若传的是字符串/数值,需先转换:Enum.Parse<WeekDays>(dayString)

内容的提问来源于stack exchange,提问作者Alina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:01:20