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)
离开一边的该枚举是否有意义作为[Flags],IMO存储该数据的唯一明智的方式是在一个int列中.只需存储值 - 不需要其他任何东西.试图强迫它作为varchar一个错误.数据库的工作是存储数据,而不是关心表示.
如果需要按此过滤,则可以在搜索中使用按位运算符,但请注意,性能受到影响,因为通过组合搜索(而不是通过相等,可以使用非聚集索引).如果您需要搜索任意组合,请考虑非规范化.如果您只需要搜索可预测的位,那么您可以使用计算的持久索引列来解除这些位 - 即您可以使用表示位2 的自动IsDrinker列(bit).
我编写了下面的方法来获取逗号分隔的枚举 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)
| 归档时间: |
|
| 查看次数: |
1870 次 |
| 最近记录: |