使用FlagsAttribute将Enum解析为SqlParameter

Cha*_*thJ 5 c# sql sql-server enums stored-procedures

我有一个Enum with Flags属性.

  [Flags]
    public enum AlcoholStatus
    {
        NotRecorded = 1,
        Drinker = 2,
        NonDrinker = 4
    }
Run Code Online (Sandbox Code Playgroud)

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

new SqlParameter("@AlcoholStatus", SqlDbType.VarChar) {Value = (int) AlcoholStatus}
Run Code Online (Sandbox Code Playgroud)

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

我正在为存储过程解析此参数,如果我可以将值解析为"1,2,3",我更喜欢.这样做的最佳方法是什么?

或者是否有任何其他简单的方法通过将整数值7解析为存储过程来过滤记录?

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

WHERE AlcoholStatus IN "1,2,4,"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 8

离开一边的该枚举是否有意义作为[Flags],IMO存储该数据的唯一明智的方式是在一个int列中.只需存储值 - 不需要其他任何东西.试图强迫它作为varchar一个错误.数据库的工作是存储数据,而不是关心表示.

如果需要按此过滤,则可以在搜索中使用按位运算符,但请注意,性能受到影响,因为通过组合搜索(而不是通过相等,可以使用非聚集索引).如果您需要搜索任意组合,请考虑非规范化.如果您只需要搜索可预测的位,那么您可以使用计算的持久索引列来解除这些 - 即您可以使用表示位2 的自动IsDrinker列(bit).


Cha*_*thJ 0

我编写了下面的方法来获取逗号分隔的枚举 ID,以便将其解析到数据库。

private static string GetAlcoholStatuses(Enums.Enums.AlcoholStatus? alcoholStatus)
{
    if (alcoholStatus == null)
        return string.Empty;

    Enums.Enums.AlcoholStatus alcoholStatusValue = alcoholStatus.Value;
    string alcoholStatuses = string.Empty;

    if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.Drinker))
    {
        alcoholStatuses = string.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.Drinker, ",");
    }
    if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.NonDrinker))
    {
        alcoholStatuses = string.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.NonDrinker, ",");
    }
    if (alcoholStatusValue.HasFlag(Enums.Enums.AlcoholStatus.NotRecorded))
    {
        alcoholStatuses = string.Format("{0}{1}{2}", alcoholStatuses, (int)Enums.Enums.AlcoholStatus.NotRecorded, ",");
    }

    return alcoholStatuses;
}
Run Code Online (Sandbox Code Playgroud)