`

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

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

    
分享到:
评论

相关推荐

    SQL、T-SQL与PL-SQL的区别

    由于PL-SQL融合了SQL语言的灵活性和过程化的概念,使得PL-SQL成为了一种功能强大的结构化语言,可以设计复杂的应用。 在实践中,SQL、T-SQL和PL-SQL都是关系数据库中的必备语言,但它们之间存在着一定的区别。SQL是...

    Go-sqrl-SQL查询构建器Squirrel的分支并改进了性能

    Squirrel是一个静态类型的SQL构造库,它允许开发者以一种类型安全的方式构建SQL查询,避免了字符串拼接导致的潜在错误。Go-sqrl在Squirrel的基础上,通过优化内部实现,提升了查询构建和执行的速度,这对于大数据...

    Go-Go-SQLBuilder是一个用于创建SQL语句的工具函数库

    3. **动态构建**:由于Go语言的强类型特性,Go-SQLBuilder可以根据不同的条件或循环结构动态生成SQL,这在处理复杂查询逻辑时非常有用。 4. **支持多种操作**:除了基本的SELECT、INSERT、UPDATE和DELETE语句外,Go...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL...

    强类型面向对象动态SQL生成器的设计与实现.pdf

    总结起来,强类型面向对象动态SQL生成器Wiz是一种创新的数据库访问解决方案,它通过提供一种更安全、高效且易于使用的SQL构造方式,降低了开发难度,提高了开发速度,同时保证了数据库操作的安全性。其设计和实现对...

    extjs 在线sql查询

    6. **用户界面设计**: `VisualSQLQueryBuilder` 提供了一种图形化的方式来构建查询,可能包括表选择、字段选择、条件设置等,界面设计要直观且易于理解。 7. **事件监听和响应**: 用户在界面上的每一步操作,如添加...

    GKD-Base中嵌入式SQL的设计与实现.pdf

    在探讨GKD-Base数据库管理系统中嵌入式SQL的设计与实现之前,我们首先需要了解嵌入式SQL的基本概念及其在数据库管理系统中的作用和重要性。嵌入式SQL是指将SQL语句直接嵌入到高级编程语言中,如C或COBOL,从而实现对...

    Mastering SQL Server Profiler---一本专业sql教程

    通过以上内容的详细介绍,我们可以看出,《Mastering SQL Server Profiler》不仅是一本理论性强的参考书,更是一本实践性极高的指导手册,对于希望提升数据库管理技能的专业人士来说,无疑是一本极具价值的学习资源...

    linq to datasets,通过linq访问强类型数据集

    **LINQ to Datasets:通过LINQ访问强类型数据集** ...总之,LINQ to Datasets提供了一种高效、类型安全的方式来处理内存中的数据集,使得.NET开发者能够更便捷、更直观地进行数据操作,从而提升开发效率和代码质量。

    人工智能-项目实践-C#-基于C#+sqlserver的学生信息管理系统.zip

    它的强类型、安全性以及对.NET Framework的全面支持,使得开发者可以方便地创建复杂的管理系统。 SQL Server是微软公司推出的一款关系型数据库管理系统,以其强大的数据处理能力、稳定性和安全性受到广大开发者的...

    网上商城购物系统-----C#+SQL+ASP.NET

    网上商城购物系统是一种基于互联网技术,利用C#编程语言、SQL数据库管理和ASP.NET框架构建的电子商务平台。这个系统集成了商品展示、用户注册与登录、购物车管理、订单处理、支付接口等多种功能,旨在为用户提供便捷...

    sql-dsl-java:SQL查询构建器和运行器,强类型且易于使用,符合JPA批注

    SQL DSL(Domain Specific Language)是一种专门用于数据库查询的语言,它将SQL语句的构建与执行封装为一种类型安全、易于理解和使用的API,通常与ORM(对象关系映射)框架结合使用,如JPA(Java Persistence API)...

    SQL-Front 5.1.4.16 注册版

    SQL-Front 5.1.4.16 注册版是一款专为MySQL数据库设计的第三方图形界面客户端工具,它提供了一个直观且用户友好的界面,使得数据库开发与管理变得更加便捷。这款软件支持多种操作,包括数据查询、编辑、导入导出、...

    功能完全的XML数据查询语言X-SQL.pdf

    XML数据查询语言X-SQL是一种新型的数据库查询语言,它的设计初衷是为了弥补现有XML查询语言的一些不足之处。X-SQL借鉴了SQL数据库查询语言的结构和特点,能够支持路径表达式查询,并且能够在多个数据源中选取数据。...

    70-432 TS Microsoft SQL Server 2008, Implementation and Maintenance

    考生应熟悉Transact-SQL(T-SQL)语言,用于编写查询、更新和删除语句。理解数据类型、约束和关系模型至关重要,以确保数据的一致性和完整性。此外,考生还应掌握如何利用索引来提高查询性能,并了解分区视图和链接...

    sql实现多行合并一行

    在SQL中,有时候我们需要将查询结果中多行的数据合并成一行,这在处理某些特定的报表或数据分析时非常有用。这种技术通常被称为行合并或行聚合。在本例中,我们将探讨如何使用纯SQL实现这一功能,特别是针对Oracle...

    TypeQuery:NETSQL查询生成器,在C#中启用强类型和可读SQL

    TypeQuery是一个针对.NET平台的SQL查询构建工具,特别为C#开发者设计,旨在提供一种强类型且具有高度可读性的SQL查询方式。它允许程序员在编写SQL查询时使用C#的语法,避免了字符串拼接SQL语句时可能出现的错误,并...

Global site tag (gtag.js) - Google Analytics