無(wú)論使用int還是varchar,對(duì)于Status的多選查詢都是不易應(yīng)對(duì)的。舉例,常規(guī)思維下對(duì)CustomerStatus的Enum設(shè)置如下:
復(fù)制代碼代碼如下:
[Serializable]
public enum CustomerStatus
{
New = 0,
Active = 1,
Overdue = 2,
Suspended = 3,
Closing = 4,
Closed = 5
}
在數(shù)據(jù)庫(kù)中以int形式存儲(chǔ)了Status值。
如果我在頁(yè)面中想一次搜索狀態(tài)為Active,Overdue和Suspended狀態(tài)的Customer,該怎么辦?程序是不是得把這三個(gè)狀態(tài)值
拼成字符串傳遞給SQL去處理?雖然能實(shí)現(xiàn),但是相當(dāng)?shù)托А?nbsp;
現(xiàn)在給出一個(gè)標(biāo)準(zhǔn)解決方案:
(1). 所有可能被用作搜索條件的枚舉都應(yīng)按如下位運(yùn)算方式定義。
復(fù)制代碼代碼如下:
public enum CustomerStatus
{
New = 1,
Active = 1<<1,
Overdue = 1<<2,
Suspended = 1<<3,
Closing = 1<<4,
Closed = 1<<5
}
(2). 在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),Status的字段必須為int型。
這樣當(dāng)我們做多選查詢時(shí)@Status的Value= CustomerStatus.Active | CustomerStatus. Overdue| CustomerStatus. Suspended
(3). 查詢語(yǔ)句如下:
復(fù)制代碼代碼如下:
Select *
From Customer
Where [Status] & @Status = [Status]
如果@Status可為null時(shí),
復(fù)制代碼代碼如下:
Select *
From Customer
Where ( @Status is null Or [Status] & @Status = [Status])
用這樣一條簡(jiǎn)單的語(yǔ)句,就可以獲取到所有符合@Status要求的數(shù)據(jù)行。