??? 看過很多強類型查詢的實現(xiàn),覺得通過層層嵌套的方法來構造,感覺很不直觀,昨天下午花了點時間寫了個驗證的代碼,現(xiàn)在發(fā)上來大家看看這樣子實現(xiàn)的查詢方便不方便,有什么問題,因為是突發(fā)奇想,所以未經過嚴格驗證,所以如果發(fā)現(xiàn)問題請溫柔提出.
??? 這里只是個驗證想法的代碼,所以沒有作任何容錯和擴展性處理.也不要提出OO不OO的看法,毫無疑義.
??? 我所設想的是一個查詢 Select [Columnlist] From [TableName] Where [Exp] Order By [PK] 一般來說是這個格式,我們最難表述的其實就是[Exp]這個部分。前面的都比較格式化,所以可以通過嵌套方法來實現(xiàn)還是比較合適的,但是[Exp]這個部分用諸如AND(Exp1,Exp2)這樣子的形式不能很直觀的看出表達式的意義,所以通過重載操作符的方式來實現(xiàn),這里我們假設在Entity的Class里有static成員來存儲列的名稱。那么
????
???? Exp Rs=new Exp(User.ID) == 2 & new Exp(User.State) > 0 ;
????
??? ?這樣子的格式就能表達Where后面的?ID=2 AND State>0 這個表達式
???? 具體代碼如下
????
??? 這里只是個驗證想法的代碼,所以沒有作任何容錯和擴展性處理.也不要提出OO不OO的看法,毫無疑義.
??? 我所設想的是一個查詢 Select [Columnlist] From [TableName] Where [Exp] Order By [PK] 一般來說是這個格式,我們最難表述的其實就是[Exp]這個部分。前面的都比較格式化,所以可以通過嵌套方法來實現(xiàn)還是比較合適的,但是[Exp]這個部分用諸如AND(Exp1,Exp2)這樣子的形式不能很直觀的看出表達式的意義,所以通過重載操作符的方式來實現(xiàn),這里我們假設在Entity的Class里有static成員來存儲列的名稱。那么
????
???? Exp Rs=new Exp(User.ID) == 2 & new Exp(User.State) > 0 ;
????
??? ?這樣子的格式就能表達Where后面的?ID=2 AND State>0 這個表達式
???? 具體代碼如下
??1
????
class
?Program
??2
????
{
??3
????????
static
?
void
?Main(
string
[]?args)
??4
????????
{
??5
??6
????????????Exp?rs?
=
?
new
?Exp(
"
C1
"
)?
==
?
25
?
&
?
new
?Exp(
"
C2
"
)?
>
?
3
?
|
?
new
?Exp(
"
C3
"
)?
<
?
5
?
^
?
new
?Exp(
"
C4
"
)?
%
?
"
hehe
"
;
??7
????????????Console.WriteLine(rs.Sql);
??8
????????????
foreach
?(SqlParameter?sp?
in
?rs.Sps)
??9
????????????
{
?10
????????????????Console.WriteLine(sp.ParameterName);
?11
????????????}
?12
????????????Console.Read();
?13
????????}
?14
????}
?15
?16
????
class
?Exp
?17
????
{
?18
????????
private
?
string
?_Sql;
?19
?20
????????
private
?List
<
SqlParameter
>
?sps;
?21
?22
????????
public
?List
<
SqlParameter
>
?Sps
?23
????????
{
?24
????????????
get
?
{?
return
?sps;?}
?25
????????????
set
?
{?sps?
=
?value;?}
?26
????????}
?27
?28
????????
private
?SqlParameter?sp;
?29
?30
????????
public
?
string
?Sql
?31
????????
{
?32
????????????
get
?
{?
return
?_Sql;?}
?33
????????}
?34
?35
????????
private
?Exp()
?36
????????
{
?37
????????????sps?
=
?
new
?List
<
SqlParameter
>
();
?38
????????}
?39
?40
????????
public
?Exp(
string
?CollumnName)
?41
????????
{
?42
????????????_Sql?
=
?CollumnName;
?43
????????}
?44
?45
????????
public
?
static
?Exp?
operator
?
==
(Exp?Left,?Object?Value)
?46
????????
{
?47
????????????Exp?Next?
=
?
new
?Exp();
?48
????????????Next.sp?
=
?
new
?SqlParameter(Left._Sql,?Value);
?49
????????????Next.sps.Add(Next.sp);
?50
????????????Next._Sql?
=
?Left._Sql?
+
?
"
?=?@
"
?
+
?Left.Sql;
?51
????????????
return
?Next;
?52
????????}
?53
????????
public
?
static
?Exp?
operator
?
!=
(Exp?Left,?Object?Value)
?54
????????
{
?55
????????????Exp?Next?
=
?
new
?Exp();
?56
????????????Next.sp?
=
?
new
?SqlParameter(Left._Sql,?Value);
?57
????????????Next.sps.Add(Next.sp);
?58
????????????Next._Sql?
=
?Left._Sql?
+
?
"
?<>?@
"
?
+
?Left._Sql;
?59
????????????
return
?Next;
?60
????????}
?61
?62
????????
public
?
static
?Exp?
operator
?
<
(Exp?Left,?Object?Value)
?63
????????
{
?64
????????????Exp?Next?
=
?
new
?Exp();
?65
????????????Next.sp?
=
?
new
?SqlParameter(Left._Sql,?Value);
?66
????????????Next.sps.Add(Next.sp);
?67
????????????Next._Sql?
=
?Left._Sql?
+
?
"
?<?@
"
?
+
?Left._Sql;
?68
????????????
return
?Next;
?69
????????}
?70
????????
public
?
static
?Exp?
operator
?
>
(Exp?Left,?Object?Value)
?71
????????
{
?72
????????????Exp?Next?
=
?
new
?Exp();
?73
????????????Next.sp?
=
?
new
?SqlParameter(Left._Sql,?Value);
?74
????????????Next.sps.Add(Next.sp);
?75
????????????Next._Sql?
=
?Left._Sql?
+
?
"
?>?@
"
?
+
?Left._Sql;
?76
????????????
return
?Next;
?77
????????}
?78
?79
????????
public
?
static
?Exp?
operator
?
%
(Exp?Left,?Object?Value)
?80
????????
{
?81
????????????Exp?Next?
=
?
new
?Exp();
?82
????????????Next.sp?
=
?
new
?SqlParameter(Left._Sql,?Value);
?83
????????????Next.sps.Add(Next.sp);
?84
????????????Next._Sql?
=
?Left._Sql?
+
?
"
?Like?@
"
?
+
?Left._Sql;
?85
????????????
return
?Next;
?86
????????}
?87
?88
????????
public
?
static
?Exp?
operator
?
&
(Exp?Left,?Exp?Right)
?89
????????
{
?90
????????????Exp?Next?
=
?
new
?Exp();
?91
????????????
foreach
?(SqlParameter?sp?
in
?Left.sps)
?92
????????????
{
?93
????????????????Next.sps.Add(sp);
?94
????????????}
?95
????????????
foreach
?(SqlParameter?sp?
in
?Right.sps)
?96
????????????
{
?97
????????????????Next.sps.Add(sp);
?98
????????????}
?99
????????????Next._Sql?
=
?Left.Sql?
+
?
"
?AND?
"
?
+
?Right.Sql;
100
????????????
return
?Next;
101
????????}
102
103
104
????????
public
?
static
?Exp?
operator
?
|
(Exp?Left,?Exp?Right)
105
????????
{
106
????????????Exp?Next?
=
?
new
?Exp();
107
????????????
foreach
?(SqlParameter?sp?
in
?Left.sps)
108
????????????
{
109
????????????????Next.sps.Add(sp);
110
????????????}
111
????????????
foreach
?(SqlParameter?sp?
in
?Right.sps)
112
????????????
{
113
????????????????Next.sps.Add(sp);
114
????????????}
115
????????????Next._Sql?
=
?Left.Sql?
+
?
"
?OR?
"
?
+
?Right.Sql;
116
????????????
return
?Next;
117
????????}
118
119
????????
public
?
static
?Exp?
operator
?
^
(Exp?Left,?Exp?Right)
120
????????
{
121
????????????Exp?Next?
=
?
new
?Exp();
122
????????????
foreach
?(SqlParameter?sp?
in
?Left.sps)
123
????????????
{
124
????????????????Next.sps.Add(sp);
125
????????????}
126
????????????
foreach
?(SqlParameter?sp?
in
?Right.sps)
127
????????????
{
128
????????????????Next.sps.Add(sp);
129
????????????}
130
????????????Next._Sql?
=
?Left.Sql?
+
?
"
?NOT?
"
?
+
?Right.Sql;
131
????????????
return
?Next;
132
????????}
133
????}
134
???

??2

??3

??4

??5

??6

??7

??8

??9

?10

?11

?12

?13

?14

?15

?16

?17

?18

?19

?20

?21

?22

?23

?24

?25

?26

?27

?28

?29

?30

?31

?32

?33

?34

?35

?36

?37

?38

?39

?40

?41

?42

?43

?44

?45

?46

?47

?48

?49

?50

?51

?52

?53

?54

?55

?56

?57

?58

?59

?60

?61

?62

?63

?64

?65

?66

?67

?68

?69

?70

?71

?72

?73

?74

?75

?76

?77

?78

?79

?80

?81

?82

?83

?84

?85

?86

?87

?88

?89

?90

?91

?92

?93

?94

?95

?96

?97

?98

?99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

????
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
