上文中只是解决了添加、修改、显示列表的问题,但是在多关键字查询的时候就又要开始赋值和拼接字符串啦。为了偷懒和省去那些让人讨厌的烦琐事情俺就又开始想取巧的办法啦。
多关键字查询,一般的处理方法是,取出这些查询条件,然后拼接成字符串,然后传个数据层的函数,然后返回DatSet一类的数据集。在这个过程中有几个让人讨厌的地方:
- 查询条件过多的时候,参数名就会n多。代码不好看
- 需要连接字符串,并且判断具体要求是like 还是 =
- 当查询条件变化或者查询要求变化时改代码很是麻烦,容易出错
第一个比较好解决,把这些参数声明成一个类直接当参数传进去就行啦。我们现在项目就是这样做的
第二个就比较麻烦啦。怎么样让这些参数知道自己是什么操作呢?也可以说怎么让程序自动的知道这些属性要做什么操作呢?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; }
}
}
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);
}
}
}
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就会自己来拼接字符串啦!