现在的位置: 首页 > 综合 > 正文

一点构想-直观的强类型的SQL查询的一种实现

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

    

抱歉!评论已关闭.