ASP.NET偷懒大法三 (利用Attribute特性简化多查询条件拼接sql语句的麻烦)

摘要:
请参阅“ORM框架实现自动绑定、添加和修改数据<或痛苦地编写赋值语句”)以上内容仅解决了添加、修改和显示列表的问题,并且当查询条件或查询要求发生变化时,判断特定要求是否为like或=很麻烦。将这些参数声明为一个类并直接传入。也可以说,如何让程序自动知道这些参数属性的作用是什么?

        最近公司在做武汉公交信息化管理系统,做这种管理项目,最让人痛苦的就是表单的添加、修改、查询。添加、修改在我以前的文章中提到过,利用反射机制可以做到基本不写代码来完成。参见《ORM框架实现数据的自动绑定添加修改 <一>》。(不过遗憾的是,目前做的项目中没使用,还是在痛苦的写赋值语句)

        上文中只是解决了添加、修改、显示列表的问题,但是在多关键字查询的时候就又要开始赋值和拼接字符串啦。为了偷懒和省去那些让人讨厌的烦琐事情俺就又开始想取巧的办法啦。

        多关键字查询,一般的处理方法是,取出这些查询条件,然后拼接成字符串,然后传个数据层的函数,然后返回DatSet一类的数据集。在这个过程中有几个让人讨厌的地方:

  1. 查询条件过多的时候,参数名就会n多。代码不好看
  2. 需要连接字符串,并且判断具体要求是like 还是 =
  3. 当查询条件变化或者查询要求变化时改代码很是麻烦,容易出错

       第一个比较好解决,把这些参数声明成一个类直接当参数传进去就行啦。我们现在项目就是这样做的

       第二个就比较麻烦啦。怎么样让这些参数知道自己是什么操作呢?也可以说怎么让程序自动的知道这些属性要做什么操作呢?Attribute 对就是这个玩意。.net中这个像洗盘一样的类。把他吸到参数上面,然后把操作符传给他不就行啦!

代码很简单,简单写一下:

首先声明一个带一个属性的Attribute,用这个属性来存操作符

[AttributeUsage(AttributeTargets.Field)] //此属性只能用在Field上
    public class OpAttribute : Attribute
    {
        
private string _op = string.Empty;
    
        
public OpAttribute(string op)
        {
            _op 
= op; 
        }

        
public string Name
        {
            
get { return _op; }
            
set { _op = value; }
        }
    }

然后在查询条件的类中加上这些Attribute

public class AttributeClass
{
        [OpAttribute(
"=")]
        
public int MyProperty;
        [OpAttribute(
"=")]
        
public string aa;
        [OpAttribute(
"like")]
        
public string bb;
}

然后再调用一个组合sql语句的方法

AttributeClass ac = new AttributeClass();
ac.MyProperty 
= 11;
ac.aa 
= "abcd";
ac.bb 
= "我唉你";
string sql="1=1";
Type type 
= typeof(AttributeClass);
foreach (System.Reflection.FieldInfo fieldInfo in type.GetFields())
{
                
foreach (Attribute at in fieldInfo.GetCustomAttributes(true))
                {
                    OpAttribute att 
= at as OpAttribute;
                    
if (att != null)
                    {
                        sql 
+= " and " + fieldInfo.Name +" "+ att.Name+" "+ fieldInfo.GetValue(ac);
                    }
                }
}

大功告成。简单实用。当你的查询条件有数十个的时候,这种方法就太方便啦。当然这个只是思路具体还是要完善的。比如实现or操作或者group by操作等等。还可以把这个拼接字符串的方法写成一个积累,这样这个AttributeClass就会自己来拼接字符串啦!

免责声明:文章转载自《ASP.NET偷懒大法三 (利用Attribute特性简化多查询条件拼接sql语句的麻烦)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在vue中用localstorage将数据存到本地Linux 6种日志查看方法,不会看日志会被鄙视的下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IIS Express加入MIME映射

       近期在用Grid Report做Web报表的时候,碰到一件非常挠头的事。   本地用VS2010写的代码,调试的时候Web报表无法显示,用24.248server上VS2013相同仍是无法显示。最后把项目部署在IISserver上还是无法显示。   然后就是各种百度。度娘说在IIS上面没有建立MIME映射,所以浏览器无法载入grf文件。好...

js/java 获取、添加、修改、删除cookie(最全)

  一、cookie介绍 1.cookie的本来面目   HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求...

MySQL插入重复数据

MySQL中批量insert into时防止更新插入重复数据去重的方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: INSERT IGNORE INTO `table_nam...

QtDbus的API及示例

目录 1. Client :: Method Call 1.1. 方法1: 直接使用 Message 传递消息(Low-Level-API) 1.2. 方法2: 通过 DBusInterface 调用方法(同步+异步) 1.3. 方法3: 从XML导入代理类 2. Subscriber :: Signal Catching 2.1. 方法1:...

C#系列之聊聊.Net Core的InMemoryCache

个人博客:http://www.boydwang.com/2017/12/net-core-in-memory-cache/ 这两天在看.net core的in memory cache,这里记录一下用法,主要涉及MemoryCache的Get/Set/Expire/Flush。首先我们先用dotnet命令创建一个mvc的项目,这里我们将使用post...

实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情况下,获取本机名失败,函数返回 UnknownHostException 异常对象。 在正常情况下,函数返回数据的类...