c# - 将带有 FlagsAttribute 的枚举解析为 SqlParameter

标签 c# sql sql-server stored-procedures enums

我有一个带有 Flags 属性的枚举。

  [Flags]
    public enum AlcoholStatus
    {
        NotRecorded = 1,
        Drinker = 2,
        NonDrinker = 4
    }

我正在创建一个 Sqlparameter,如下所示。

new SqlParameter("@AlcoholStatus", SqlDbType.VarChar) {Value = (int) AlcoholStatus}

如果 AlcoholStatus 具有所有值(NotRecorded | Drinker | NonDrinker),它会返回 7 作为 SqlParameter 的值。

我正在为存储过程解析此参数,如果我可以将值解析为“1,2,3”,我更愿意。执行此操作的最佳方法是什么?

或者有没有其他简单的方法通过将整数值 7 解析到存储过程来过滤记录?

编辑:这发生在用户希望看到具有上述任何状态的人的功能过滤器中。 这是一个相当复杂的sql查询。我在那里过滤 AlcoholStatus 如下

WHERE AlcoholStatus IN "1,2,4,"

最佳答案

撇开枚举是否有意义作为[Flags],IMO 存储此数据的唯一明智方式是在int列。只需存储值 - 不需要其他任何东西。试图将其强制转换为 varchar 是错误的。数据库的工作是存储数据,而不是关心表示。

如果您需要按此进行过滤,您可以在搜索中使用按位运算符,但请注意,性能会受到影响,因为在按组合搜索时(而不是通过相等性搜索,后者可以使用非聚集索引)。如果您需要搜索任意组合,请考虑非规范化。如果您只需要搜索可预测位,那么您可以使用计算的持久索引列将它们提取出来 - 即您可以有一个自动 IsDrinker 列(bit) 表示第 2 位。

关于c# - 将带有 FlagsAttribute 的枚举解析为 SqlParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086212/

相关文章:

c# - 自动运行 ASP.net c# Web 应用程序

sql - 使用索引加速左 anchor 查询?

sql-server - 事务中的多个参数化的Delphi SQL更新

SQL 根据另一个表删除行

php - Mysql根据单个列的唯一值限制返回结果的数量

sql - 如何合并这两个查询

sql-server - 有没有办法只存储一次字段值?

c# - 嵌套 Ninject 绑定(bind) - 依赖注入(inject)

c# - 请解释 C# 属性是如何工作的?

c# - 如何检查两个.wav文件是否包含相同的声音数据?