看过很多强类型查询的实现,觉得通过层层嵌套的方法来构造,感觉很不直观,昨天下午花了点时间写了个验证的代码,现在发上来大家看看这样子实现的查询方便不方便,有什么问题,因为是突发奇想,所以未经过严格验证,所以如果发现问题请温柔提出.
这里只是个验证想法的代码,所以没有作任何容错和扩展性处理.也不要提出OO不OO的看法,毫无疑义.
我所设想的是一个查询 Select [Columnlist] From [TableName] Where [Exp] Order By [PK] 一般来说是这个格式,我们最难表述的其实就是[Exp]这个部分。前面的都比较格式化,所以可以通过嵌套方法来实现还是比较合适的,但是[Exp]这个部分用诸如AND(Exp1,Exp2)这样子的形式不能很直观的看出表达式的意义,所以通过重载操作符的方式来实现,这里我们假设在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]这个部分。前面的都比较格式化,所以可以通过嵌套方法来实现还是比较合适的,但是[Exp]这个部分用诸如AND(Exp1,Exp2)这样子的形式不能很直观的看出表达式的意义,所以通过重载操作符的方式来实现,这里我们假设在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 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