欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【用扩展方法优化多条件查询(不定条件查询)】,下面是详细的讲解!
用扩展方法优化多条件查询(不定条件查询)
在我们开发过程中,特别是管理系统的开发,经常会遇到多条件查询(或者叫不定条件查询)的案例,就是提供给User输入的查询条件有多个不同的查询栏位,而且,在实际使用中并不能确定User会使用哪些条件来当做搜索条件。
下图就是我们实际项目中一个查询页面的截图,
User在实际操作中,有可能会只根据[扣帐编号]查询,那么,只要在[扣帐编号]栏位输入号码,其他栏位留空即可,那么查询语句就只卡[扣帐编号]这条条件也有可能直接根据日前范围查询,只要输入起始日期即可。当然,在实际开发的时候我们是不能预判User的行为的,因此,正常情况下我们都是用Sql拼接的方法来应对这个问题:
这样,就在生成Sql语句之前对User的输入行为做了判断:对于某个查询条件,如果User有输入,则加入Sql的Where条件中,有个没有输入,则不予考虑。
对于日期范围的判断,可以这样写:
下面是我们实际开发中的完整代码(省略了一些无关的逻辑):
这样一来,如果参数多一点的话,一个简单的Get方法就要写50行以上的代码,虽然不能以代码的行数来评定开发效率,但这种方法无疑增加了代码量,
也降低的代码的可读性和可维护性。
以前,为了给这种情况找到一种更“优雅”,更简洁的方法,也有在网上找了一些资料,发现其他人的方法也是大同小异,差不多都是这样按条件拼接。
园子里有一位同学(现在忘记是哪位了O(∩_∩)O哈!)提出了一种解决方案就是把判断的逻辑直接写到Sql语句或者存储过程中:
这个方法虽然一定程度上减少了代码量,但是把业务逻辑混杂在Sql语句中,个人感觉不是太好的方法,而且大大增加了维护的难度。当然,有兴趣的同学可以
自己去研究。
既然,以上方法都有弊端,那么有没有更好一点的解放方案呢?答案是肯定的,上次用EF的时候突然想到.Net中的扩展方法能够对这个问题进行优化。
首先,来看一下什么事扩展方法,一下是来做MSDN的解释:
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
我们常用的Linq中引用的 using System.Linq 其实就是一个扩展方法库,更详细的内容可以参照MSDN和c# 扩展方法奇思妙用(鹤冲天)。在这里,我只举一个简单的例子:
比如,正常情况下判断一个字符串是否为空是这样写:
那么以后判断字符串是否为空就可以这样:
是不是简洁、优雅了许多呢?
好,回到正题,看看如何用扩展方法的特性来优化Sql语句的拼接问题。既然扩展方法允许我们以实例方法的方式来调用静态方法,那么我们是否可以给Sql语句的字符串实例扩展一个方法来对其操作呢?
比如这个Sql:
实际上就是对一个变量进行判断,然后操作字符串实例。
那么,我们就加行一个这样的扩展:
看到没有,在方法内部进行参数的非空判断,那么,上面的代码就可以这样写:
是不是少了很多代码?
如果有更多的参数,我们可以写的想Linq一样优雅:
对于like语句,进行下面的扩展
和范围的扩展:
这样一来,上面一大段的代码就可以写成这样:
对于其他的一下扩展方法,我写了一个类文件,有兴趣的可以点此下载。
第一次正正经经的写博文,累死我了。由于自己也是个菜鸟,想把一个问题讲清楚让更多的“菜鸟”也能看懂,难免有些啰嗦,有不足的地方还请大家多多指教。
关于用扩展方法优化多条件查询(不定条件查询)的用户互动如下:
相关问题:在C#里面如何写参数化sql语句,参数个数不定,就像...
答:for (int i = 0; i < temp.Length; i++){sb.Append(temp[i]);}comm.CommandText = sb.ToString();}}if (comm.Connection.State != ConnectionState.Open){comm.Connection.Open();}return comm.ExecuteReader(CommandBehavior.CloseConnection);... >>详细
相关问题:mysql多条件查询的优化
答:如果对查询要求高,可使用myisam. 几个优化建议: (1)适当的建立字段索引。 (2)注意sql条件的顺序,把能够排除掉大量数据的条件写在前面。 >>详细
相关问题:求大神帮忙优化一条SQL语句(多表查询,每个inner ...
答:改变一下inner join顺序试试呢?另外现在有哪些索引? tim_spac说的没错,并没有使用表goods_color和goods_size中的其它字段,size_id和color_id在表goods_sku中都有,可以不用join这两个表,除非为了数据一致性或取得相关的其它字段。 SELECT g... >>详细
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【服务器】asp.net页面状态管理cookie和服务器状
- 如何取消.net后台线程的执行
- 【WeakReference】WeakReference(弱引用)让GC需要
- 【ajax格式】asp.net中在用ajax格式传递数据到asp
- 【字符文本】asp.net 数据绑定 使用eval 时候报
- 【Repeater控件】.NET实现Repeater控件+AspNetPag
- 【客户端】获取客户端IP地址c#/vb.net各自实现代
- 【asp】asp.net上传execl文件后 在页面上加载显示
- 【Excel】页面导出为Excel的时间格式的问题-时间
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
