Pau*_*ith 1 c# sql flags bit-manipulation
采用这种情况:您在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
Run Code Online (Sandbox Code Playgroud)
甜.您可以包括/使用逐逻辑,它可以让你瞬间滋润复选框列表和Asp.NET选择列表中,同时仍然只存储一个64位数字,以保持选择的任何组合SQL和C#动态排除.并且在过程的WHERE子句中不需要非可索引的比较运算符,除了最多包含64行的枚举表本身.在经销商处搜索运往印第安纳州和加利福尼亚州的所有人仍然可以使用相等比较和索引.
现在您要求增加对美国领土,武装部队邮政编码和加拿大各省的支持,并以向后兼容的方式进行.没有将名单减少到<64个条目,并且企业确实希望避免将老派国家与其他地区和部门隔离开来.
你是做什么?
创意的答案是值得赞赏的,但这里真正的挑战是这样的:有没有办法迫使同样按位数学,关于无符号64位值工程上签字的人工作,而使用负空间超过64个可能的位,在C#和SQL(2008)?如果重要,则模拟标志,而不是"真实"标志,因此从技术上讲,不需要使用[Flags]属性来对抗CLR枚举.
| 归档时间: |
|
| 查看次数: |
3639 次 |
| 最近记录: |