动态创建ActiveRecord条件的查询 MyQuery
生活随笔
收集整理的這篇文章主要介紹了
动态创建ActiveRecord条件的查询 MyQuery
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在CMS中。我們經常會按一定的條件來進行搜索。如果用戶沒有選擇這個條件的話,我們就不能將它放到sql中
也許我們可以用自己拼裝sql語句的方式很好的實現這種查詢。然后再前面過濾掉一些危險的參數
但是參數過濾有一個不好的地方是。會把一些信息給過濾掉了。
在castle ActiveRecord里面我們最基本的查詢都是靠傳參的形式了。
ScalarQuery<xxInfo> query = new ScalarQuery<xxInfo>(typeof(xxInfo), hql,ID);
如果用傳參的話我們感覺在 ActiveRecord里會比較麻煩。寫起來不順
于是我們自己寫了一簡單的類來處下這種情況(不清楚它是否提供類似的處理類,方法)也修正了一下bug
/**////風云?lovebanyi.cnblogs.com?
public?class?MyQuery<T>?:?SimpleQuery<T>
????{
????????public?MyQuery(string?query)
????????????:?base(query)
????????{
????????}
????????private?int?i?=?0;
????????public?void?AddCondition(string?porperty,?string?@operator,?object?parm)
????????{
????????????if?(i?==?0)
????????????{
????????????????base.Query?+=?"?where?"?+?porperty?+?"?"?+?@operator?+?"??";
????????????}
????????????else
????????????{
????????????????base.Query?+=??"?and?"?+?porperty?+?"?"?+?@operator?+?"??";
????????????}
????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parm));
????????}
????????public?void?AddCondition(string?condition)
????????{
????????????if?(i?==?0)
????????????{
????????????????base.Query?+=?"?where?"?+?condition;
????????????}
????????????else
????????????{?
????????????????base.Query?+=?"?and?"+?condition;
????????????}
????????}
????????public?void?AddCondition(string?condition,?object?parm)
????????{
????????????AddCondition(condition);
????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parm));
????????}
????????public?void?AddCondition(string?condition,?List<object>?parms)
????????{
????????????AddCondition(condition);
????????????for?(int?j?=?0;?j?<?parms.Count;?j++)
????????????{
????????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parms[j]));
????????????}
????????}
????????private?System.Text.RegularExpressions.Regex?regCount?=?new?System.Text.RegularExpressions.Regex("^select(.*?)from",?System.Text.RegularExpressions.RegexOptions.Compiled?|?System.Text.RegularExpressions.RegexOptions.IgnoreCase?|?System.Text.RegularExpressions.RegexOptions.Singleline);
????????
????????protected?override?string?PrepareQueryForCount(string?countQuery)
????????{
????????????if?(regCount.IsMatch(countQuery))
????????????{
????????????????countQuery?=?regCount.Replace(countQuery,?"select?count(*)?from");
????????????}
????????????else
????????????{
????????????????countQuery?=?"select?count(*)?"?+?countQuery;
????????????}
????????????return?countQuery;
????????????
????????} V2 新加一個代碼。這樣你在返回MyQuery<int>的時候不會出錯
????????public?MyQuery(Type?targetType,?string?query)
????????????:?base(targetType,?query)
????????{?
????????}
使用 (寫在entiy的類中)
?string?hql?=?"from?Supplier";
????????????MyQuery<Supplier>?query?=?new?MyQuery<Supplier>(hql);
????????????query.SetQueryRange(start,?maxResults);
????????????query.AddCondition("Name","like","%"+name+"%");
????????????query.AddCondition("Number","=","0592");
return?query.Execute(); 當然你可以對操作符再次進行一些處理。更好的防止寫錯和加快速度
另一個小例子/Files/lovebanyi/MyQueryExample.txt
v0.2http://files.cnblogs.com/lovebanyi/myqueryV0.2.txt
也許我們可以用自己拼裝sql語句的方式很好的實現這種查詢。然后再前面過濾掉一些危險的參數
但是參數過濾有一個不好的地方是。會把一些信息給過濾掉了。
在castle ActiveRecord里面我們最基本的查詢都是靠傳參的形式了。
ScalarQuery<xxInfo> query = new ScalarQuery<xxInfo>(typeof(xxInfo), hql,ID);
如果用傳參的話我們感覺在 ActiveRecord里會比較麻煩。寫起來不順
于是我們自己寫了一簡單的類來處下這種情況(不清楚它是否提供類似的處理類,方法)也修正了一下bug
/**////風云?lovebanyi.cnblogs.com?
public?class?MyQuery<T>?:?SimpleQuery<T>
????{
????????public?MyQuery(string?query)
????????????:?base(query)
????????{
????????}
????????private?int?i?=?0;
????????public?void?AddCondition(string?porperty,?string?@operator,?object?parm)
????????{
????????????if?(i?==?0)
????????????{
????????????????base.Query?+=?"?where?"?+?porperty?+?"?"?+?@operator?+?"??";
????????????}
????????????else
????????????{
????????????????base.Query?+=??"?and?"?+?porperty?+?"?"?+?@operator?+?"??";
????????????}
????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parm));
????????}
????????public?void?AddCondition(string?condition)
????????{
????????????if?(i?==?0)
????????????{
????????????????base.Query?+=?"?where?"?+?condition;
????????????}
????????????else
????????????{?
????????????????base.Query?+=?"?and?"+?condition;
????????????}
????????}
????????public?void?AddCondition(string?condition,?object?parm)
????????{
????????????AddCondition(condition);
????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parm));
????????}
????????public?void?AddCondition(string?condition,?List<object>?parms)
????????{
????????????AddCondition(condition);
????????????for?(int?j?=?0;?j?<?parms.Count;?j++)
????????????{
????????????????base.AddModifier(new?Castle.ActiveRecord.Queries.Modifiers.QueryParameter(i++,?parms[j]));
????????????}
????????}
????????private?System.Text.RegularExpressions.Regex?regCount?=?new?System.Text.RegularExpressions.Regex("^select(.*?)from",?System.Text.RegularExpressions.RegexOptions.Compiled?|?System.Text.RegularExpressions.RegexOptions.IgnoreCase?|?System.Text.RegularExpressions.RegexOptions.Singleline);
????????
????????protected?override?string?PrepareQueryForCount(string?countQuery)
????????{
????????????if?(regCount.IsMatch(countQuery))
????????????{
????????????????countQuery?=?regCount.Replace(countQuery,?"select?count(*)?from");
????????????}
????????????else
????????????{
????????????????countQuery?=?"select?count(*)?"?+?countQuery;
????????????}
????????????return?countQuery;
????????????
????????} V2 新加一個代碼。這樣你在返回MyQuery<int>的時候不會出錯
????????public?MyQuery(Type?targetType,?string?query)
????????????:?base(targetType,?query)
????????{?
????????}
使用 (寫在entiy的類中)
?string?hql?=?"from?Supplier";
????????????MyQuery<Supplier>?query?=?new?MyQuery<Supplier>(hql);
????????????query.SetQueryRange(start,?maxResults);
????????????query.AddCondition("Name","like","%"+name+"%");
????????????query.AddCondition("Number","=","0592");
return?query.Execute(); 當然你可以對操作符再次進行一些處理。更好的防止寫錯和加快速度
另一個小例子/Files/lovebanyi/MyQueryExample.txt
v0.2http://files.cnblogs.com/lovebanyi/myqueryV0.2.txt
轉載于:https://www.cnblogs.com/lovebanyi/archive/2007/07/24/829654.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的动态创建ActiveRecord条件的查询 MyQuery的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GooglePR说明
- 下一篇: █年薪20万招聘软件工程师!!!