最近公司在做武漢公交資訊化管理系統,做這種管理項目,最讓人痛苦的就是表單的添加、修改、查詢。添加、修改在我以前的文章中提到過,利用反射機制可以做到基本不寫代碼來完成。參見《ORM架構實現資料的自動綁定添加修改 <一>》。(不過遺憾的是,目前做的項目中沒使用,還是在痛苦的寫指派陳述式)
上文中只是解決了添加、修改、顯示列表的問題,但是在多關鍵字查詢的時候就又要開始賦值和拼接字串啦。為了偷懶和省去那些讓人討厭的煩瑣事情俺就又開始想取巧的辦法啦。
多關鍵字查詢,一般的處理方法是,取出這些查詢條件,然後拼接成字串,然後傳個資料層的函數,然後返回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; }
}
}
然後在查詢條件的類中加上這些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就會自己來拼接字串啦!