看过很多强类型查询的实现,觉得通过层层嵌套的方法来构造,感觉很不直观,昨天下午花了点时间写了个验证的代码,现在发上来大家看看这样子实现的查询方便不方便,有什么问题,因为是突发奇想,所以未经过严格验证,所以如果发现问题请温柔提出. 
  
这里只是个验证想法的代码,所以没有作任何容错和扩展性处理.也不要提出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
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

