以这种情况为例:您在 C# 中有一些标志枚举与 SQL Server 中的 Enum-ish 表相关联(实际上是从这些表生成的)。假设您是分销商,并且您允许您的经销商指定他们运送到美国的哪个州。作为一名出色而优雅的软件工程师,您将这些实现为可按位组合的标志值以节省存储空间:
create table USState (
StateID bigint, StateAbbr char(2), StateName varchar(50))
/* insert all US States + DC into USState, StateIDs must be in powers of two */
/* StateID 0 reserved for 'None': */
create procedure GetStatesByFlag (@StateFlags bigint) as
declare @StateIDs table
(
StateID bigint,
primary key (StateID)
)
insert into @StateIDs
select StateID
from USState
where @StateFlags & StateID != 0
or (@StateFlags = 0 and StateID = 0)
select s.StateID, s.StateAbbr, s.StateName
from
USState s join
@StateIDs si
on si.StateID = s.StateID
甜的。您可以使用按位逻辑在 SQL 和 C# 中动态包含/排除,这使您可以立即在 Asp.NET 中混合复选框列表和选择列表,同时仍然只存储一个 64 位数字来保存任何选择组合。并且您不需要在过程的 WHERE 子句中使用不可索引的比较运算符,除非枚举表本身最多具有 64 行。在您的分销商中搜索运往印第安纳州和加利福尼亚州的每个人仍然可以使用平等比较和索引。
现在,您请求添加对美国领土、武装部队邮件代码和加拿大省份的支持,并以向后兼容的方式执行此操作。没有将列表减少到 < 64 个条目,并且该企业确实希望避免将老派州与其他地区和部门隔离开来。
你做什么工作?
创造性的答案值得赞赏,但这里真正的挑战是:有没有办法强制在无符号 64 位值上工作的相同按位数学在使用负空间超过 64 位可能的位时,在 C#和 SQL (2008)?如果重要,该标志是模拟的,而不是“真实”标志,因此从技术上讲,它不需要针对具有 [Flags] 属性的 CLR 枚举。