婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 用擴展方法優(yōu)化多條件查詢(不定條件查詢)

用擴展方法優(yōu)化多條件查詢(不定條件查詢)

熱門標簽:使用智能電話機器人違法嗎 外呼系統(tǒng)用員工身份證 朝陽市地圖標注 電話機器人廣告話術 蘇州銷售外呼系統(tǒng)預算 淘寶地圖標注如何做 太原外呼電銷機器人費用 東莞語音電銷機器人排名 保山電話外呼管理系統(tǒng)怎么用

在我們開發(fā)過程中,特別是管理系統(tǒng)的開發(fā),經常會遇到多條件查詢(或者叫不定條件查詢)的案例,就是提供給User輸入的查詢條件有多個不同的查詢欄位,而且,在實際使用中并不能確定User會使用哪些條件來當做搜索條件。

下圖就是我們實際項目中一個查詢頁面的截圖,
 
User在實際操作中,有可能會只根據[扣帳編號]查詢,那么,只要在[扣帳編號]欄位輸入號碼,其他欄位留空即可,那么查詢語句就只卡[扣帳編號]這條條件也有可能直接根據日前范圍查詢,只要輸入起始日期即可。當然,在實際開發(fā)的時候我們是不能預判User的行為的,因此,正常情況下我們都是用Sql拼接的方法來應對這個問題:

復制代碼 代碼如下:

StringBulider sbSql=new StringBulider();
sbSql.Append("select * from V_view1 where 1=1 ");
/*"注意,這里為了確保拼接Sql語句的語法正確,要加上“1=1”,因為可能后面所有的查詢條件都為空,這個語句 要以 "where 1=1" 結尾。 以前也有在園子里看到文章說加上“1=1”對查詢效率有一定影響,這個沒有深入研究過,對此持保留態(tài)度鑒于我們這里只針對一般開發(fā),數(shù)據量不是很大,所以對于這個問題暫且不做討論*/
if(!string.IsNullorEmpty(varGRNO))
sbSql.AppendFormat(" and BOLNR = '{0}' ",varGRNO);

這樣,就在生成Sql語句之前對User的輸入行為做了判斷:對于某個查詢條件,如果User有輸入,則加入Sql的Where條件中,有個沒有輸入,則不予考慮。
對于日期范圍的判斷,可以這樣寫:
復制代碼 代碼如下:

StringBulider sbSql=new StringBulider();
sbSql.Append("select * from V_view1 where 1=1 ");
if(!string.IsNullorEmpty(varGRNO))
sbSql.AppendFormat(" and BOLNR = '{0}' ",varGRNO);

if(!string.IsNullorEmpty(vardtFrom))
{
sbSql.AppendFormat(" and CRDate >= '{0}' ",Convert.ToDateTime(vardtFrom));
if(!string.IsNullorEmpty(vardtTo))
{
sbSql.AppendFormat(" and CRDate lt= '{0}' ",Convert.ToDateTime(vardtTo));
}
}

下面是我們實際開發(fā)中的完整代碼(省略了一些無關的邏輯):
復制代碼 代碼如下:

public DataTable GetGRCollections(string varShipto, string varGRNO, string varGRNOto, string varMaterialNO, string varPL, string varPLto, string varCustomerID, string varCustomerID1, string varCustomerPN, string varDateFrom, string varDateTo, string varChecked,string varSupplierPN)
{
try
{
#region Code Here................

DataTable dtResult = new DataTable();

StringBuilder sbSql = new StringBuilder();
sbSql.Append(" SELECT * ")
.Append(" FROM V_QueryGR")
.Append(" WHERE (GRTime>= '" + varDateFrom + " 'and GRTime='" + varDateTo + "')");
if (!string.IsNullOrEmpty(varShipto))
{
sbSql.Append(" and Plant='"+varShipto+"'");
}

if (!string.IsNullOrEmpty(varGRNO))
{
if (!string.IsNullOrEmpty(varGRNOto))
sbSql.Append(" and (GRNO>='" + varGRNO +"' and GRNO='"+varGRNOto+ "')");
else
sbSql.Append(" and GRNO='" + varGRNO + "'");
}
if (!string.IsNullOrEmpty(varMaterialNO))
{
sbSql.Append(" and MaterialNO='"+varMaterialNO+"'");
}

if (!string.IsNullOrEmpty(varPL))
{
if (!string.IsNullOrEmpty(varPLto))
sbSql.Append(" and (PackingNO>='" + varPL + "' and PackingNO='"+varPLto+"')");
else
sbSql.Append(" and PackingNO='" + varPL + "'");
}
if (!string.IsNullOrEmpty(varCustomerID))
{
sbSql.Append(" and CustomID='" + varCustomerID + "'");
}
if (string.IsNullOrEmpty(varCustomerID))
{
ClsCommon ObjCommon = new ClsCommon(userData);
sbSql.Append(" and CustomID in (" + ObjCommon.GetVendorPermissionString() + ")");
}
if (!string.IsNullOrEmpty(varCustomerID1))
{
sbSql.Append(" and CustomID2='" + varCustomerID1 + "'");
}
if (!string.IsNullOrEmpty(varCustomerPN))
{
sbSql.Append(" and CustomerPN='" + varCustomerPN + "'");
}
if (!string.IsNullOrEmpty(varDateFrom))
{
if (!string.IsNullOrEmpty(varDateTo))
sbSql.Append(" and (GRTime>= '" + varDateFrom + "' and GRTime='" + varDateTo + "')");
else
sbSql.Append(" and PackingNO='" + varDateFrom + "'");
}
if (varChecked == "Checked")
{
sbSql.Append(" and CheckPrice=1 ");
}
if (varChecked == "UnChecked")
{
sbSql.Append(" and CheckPrice=0");
}
if (!string.IsNullOrEmpty(varSupplierPN))
{
sbSql.Append(" and SuplierPN='" + varSupplierPN + "'");
}

try
{
ControlHandleDB();
dtResult = ControlSqlAccess.GetDataTable(sbSql.ToString());
}
catch
{
throw;
}
finally
{
ControlSqlAccess.CloseConnection();
}

return dtResult;

#endregion
}
catch (CommonObjectsException ex)
{

}
catch (Exception ex)
{

}
}

這樣一來,如果參數(shù)多一點的話,一個簡單的Get方法就要寫50行以上的代碼,雖然不能以代碼的行數(shù)來評定開發(fā)效率,但這種方法無疑增加了代碼量,
也降低的代碼的可讀性和可維護性。
以前,為了給這種情況找到一種更“優(yōu)雅”,更簡潔的方法,也有在網上找了一些資料,發(fā)現(xiàn)其他人的方法也是大同小異,差不多都是這樣按條件拼接。
園子里有一位同學(現(xiàn)在忘記是哪位了O(∩_∩)O哈!)提出了一種解決方案就是把判斷的邏輯直接寫到Sql語句或者存儲過程中:
復制代碼 代碼如下:

select * from V_view1 where ((ISNULL(@varGRNO,'')>'' and BOLNR=@varGRNO ) or (1=1))

這個方法雖然一定程度上減少了代碼量,但是把業(yè)務邏輯混雜在Sql語句中,個人感覺不是太好的方法,而且大大增加了維護的難度。當然,有興趣的同學可以
自己去研究。
既然,以上方法都有弊端,那么有沒有更好一點的解放方案呢?答案是肯定的,上次用EF的時候突然想到.Net中的擴展方法能夠對這個問題進行優(yōu)化。
首先,來看一下什么事擴展方法,一下是來做MSDN的解釋:
擴展方法使您能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態(tài)方法,但可以像擴展類型上的實例方法一樣進行調用。
我們常用的Linq中引用的 using System.Linq 其實就是一個擴展方法庫,更詳細的內容可以參照MSDN和c# 擴展方法奇思妙用(鶴沖天)。在這里,我只舉一個簡單的例子:
比如,正常情況下判斷一個字符串是否為空是這樣寫:
復制代碼 代碼如下:

string.IsNullOrEmpty(str);
如果加上一個我們自己擴展的方法:
/// summary>
/// 檢查字符串是否是空(IsNullOrEmpty)
/// /summary>
/// param name="str">/param>
/// returns>/returns>
public static bool IsNullOrEmpty(this string str)
{
return string.IsNullOrEmpty(str);
}

那么以后判斷字符串是否為空就可以這樣:
復制代碼 代碼如下:

str.IsNullOrEmpty();

是不是簡潔、優(yōu)雅了許多呢?
好,回到正題,看看如何用擴展方法的特性來優(yōu)化Sql語句的拼接問題。既然擴展方法允許我們以實例方法的方式來調用靜態(tài)方法,那么我們是否可以給Sql語句的字符串實例擴展一個方法來對其操作呢?
比如這個Sql:
復制代碼 代碼如下:

StringBulider sbSql=new StringBulider();
sbSql.Append("select * from V_view1 where 1=1 ");
if(!string.IsNullorEmpty(varGRNO))
sbSql.AppendFormat(" and BOLNR = '{0}' ",varGRNO);

實際上就是對一個變量進行判斷,然后操作字符串實例。
那么,我們就加行一個這樣的擴展:
復制代碼 代碼如下:

public static string strEquals(this string strSql, string strValue, string ColName)
{
if (!string.IsNullOrEmpty(strValue))
return string.Format(strSql + " and {0}='{1}' ", ColName, strValue);
else
return strSql;
}

看到沒有,在方法內部進行參數(shù)的非空判斷,那么,上面的代碼就可以這樣寫:
復制代碼 代碼如下:

String strSql="select * from V_view1 where 1=1"
strSql=strSql.strEquals(varGRNO,BOLNR)

是不是少了很多代碼?
如果有更多的參數(shù),我們可以寫的想Linq一樣優(yōu)雅:
復制代碼 代碼如下:

String strSql="select * from V_view1 where 1=1"
.strEquals(varGRNO,BOLNR)
.strEquals(varPLNO,VBELN)
.strEquals(varPONO,EBELN)

對于like語句,進行下面的擴展
復制代碼 代碼如下:

public static string strLike(this string strSql, string strValue, string ColName)
{
if (!string.IsNullOrEmpty(strValue))
return string.Format(strSql + " and {0} like '%{1}%' ", ColName, strValue);
else
return strSql;
}


和范圍的擴展:
復制代碼 代碼如下:

public static string strEqualsOrBetween(this string strSql, string strStart, string strEnd, string ColName)
{
if (string.IsNullOrEmpty(strStart) string.IsNullOrEmpty(strEnd))
return strSql;
else if (!string.IsNullOrEmpty(strStart) !string.IsNullOrEmpty(strEnd))
{
return strSql.strBigger(strStart, ColName).strSmaller(strEnd, ColName);
}
else if (string.IsNullOrEmpty(strStart) !string.IsNullOrEmpty(strEnd))
return strSql.strEquals(strEnd, ColName);
else
return strSql.strEquals(strStart, ColName);
}

這樣一來,上面一大段的代碼就可以寫成這樣:
復制代碼 代碼如下:

public DataTable GetGRCollections(string varShipto, string varGRNO, string varGRNOto, string varMaterialNO, string varPL, string varPLto, string varCustomerID, string varCustomerID1, string varCustomerPN, string varDateFrom, string varDateTo, string varChecked,string varSupplierPN)
{
try
{
#region Code Here................

DataTable dtResult = new DataTable();

String strSql="select * from V_QueryGR where 1=1"
.DtEqualsOrBetween(varDateFrom,varDateTo,GRTime)
.strEquals(varShipto,Plant)
.strEqualsOrBetween(varGRNO,GRNO)
.strEquals(varMaterialNO,MaterialNO)
.strEqualsOrBetween(varPL,PackingNO)
.strEquals(varCustomerID,CustomID)
.strEquals(varCustomerID1,CustomID2)
.strEquals(varCustomerPN,CustomerPN)
.DtEqualsOrBetween(varDateFrom,varDateTo,GRTime)
.strEquals(varSupplierPN,SuplierPN)
try
{
ControlHandleDB();
dtResult = ControlSqlAccess.GetDataTable(sbSql.ToString());
}
catch
{
throw;
}
finally
{
ControlSqlAccess.CloseConnection();
}

return dtResult;

#endregion
}

catch (CommonObjectsException ex)
{

}
catch (Exception ex)
{

}
}


對于其他的一下擴展方法,我寫了一個類文件,有興趣的可以點此下載。
第一次正正經經的寫博文,累死我了。由于自己也是個菜鳥,想把一個問題講清楚讓更多的“菜鳥”也能看懂,難免有些啰嗦,有不足的地方還請大家多多指教。

您可能感興趣的文章:
  • PHP實現(xiàn)多條件查詢實例代碼
  • 多條件查詢的程序
  • PHP組合查詢多條件查詢實例代碼
  • 比較不錯的asp單表單字段多條件查詢
  • 一個簡單實現(xiàn)多條件查詢的例子
  • php通過數(shù)組實現(xiàn)多條件查詢實現(xiàn)方法(字符串分割)

標簽:潛江 洛陽 克拉瑪依 運城 阿里 綏化 西藏 呼倫貝爾

巨人網絡通訊聲明:本文標題《用擴展方法優(yōu)化多條件查詢(不定條件查詢)》,本文關鍵詞  用,擴展,方法,優(yōu)化,多,條件,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用擴展方法優(yōu)化多條件查詢(不定條件查詢)》相關的同類信息!
  • 本頁收集關于用擴展方法優(yōu)化多條件查詢(不定條件查詢)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧洲精品一区二区三区不卡| 国产福利一区二区三区视频| 91精品国产一区二区三区| 国产成人精品三级| 久久成人羞羞网站| 日韩和欧美一区二区三区| caoporm超碰国产精品| 夜夜嗨av一区二区三区四季av | 精品亚洲porn| 欧美日韩亚洲高清一区二区| 国精品**一区二区三区在线蜜桃| 亚洲bt欧美bt精品| 亚洲一区二区三区小说| 亚洲乱码国产乱码精品精小说| 激情亚洲综合在线| 水蜜桃久久夜色精品一区的特点| 亚洲一区二区欧美| 亚洲伊人伊色伊影伊综合网| 亚洲精品中文在线影院| 亚洲免费在线电影| 一个色综合av| 亚洲成a人片在线不卡一二三区| 亚洲欧美日韩国产综合在线| 亚洲欧美日韩国产手机在线 | 中文字幕乱码亚洲精品一区| 久久久久久久久久久久久女国产乱 | 91丨porny丨户外露出| 国产一区二区三区观看| 欧美日高清视频| 夜色激情一区二区| 1024成人网| 亚洲欧洲在线观看av| 18欧美亚洲精品| 精品少妇一区二区三区免费观看 | 日本一区中文字幕| 麻豆免费看一区二区三区| 国产精品自拍网站| 91麻豆国产福利在线观看| 欧美日韩三级在线| 2014亚洲片线观看视频免费| 国产精品久久久久桃色tv| 亚洲成人精品一区二区| 国产美女在线观看一区| 色成人在线视频| 精品国产一区二区三区久久影院 | 精久久久久久久久久久| 国产精品资源在线| 在线观看av一区二区| 日韩午夜在线观看视频| 欧美国产激情二区三区| 一区二区成人在线观看| 玖玖九九国产精品| 色噜噜久久综合| 精品第一国产综合精品aⅴ| 欧美激情一区在线| 天天免费综合色| av色综合久久天堂av综合| 91精品婷婷国产综合久久| 中文字幕在线观看不卡视频| 日本亚洲视频在线| 91视频91自| 精品国产青草久久久久福利| 亚洲美女一区二区三区| 国内精品免费**视频| 99re视频精品| 国产欧美日韩亚州综合| 日韩精品一二区| 欧美性一二三区| 国产女人aaa级久久久级| 婷婷国产v国产偷v亚洲高清| 91首页免费视频| 亚洲精品一线二线三线| 日韩国产欧美在线观看| 在线精品视频免费播放| 亚洲欧洲另类国产综合| 国产91精品一区二区麻豆网站| 欧美日韩国产高清一区二区| 欧美变态口味重另类| 偷窥国产亚洲免费视频| 成人av网站在线观看| 精品国产亚洲在线| 蜜桃久久精品一区二区| 欧美二区在线观看| 亚洲成a人v欧美综合天堂| 9人人澡人人爽人人精品| 久久综合99re88久久爱| 久久精品国产第一区二区三区| 欧美精品久久天天躁| 欧美人与z0zoxxxx视频| 亚洲精品五月天| 91视频一区二区| 亚洲女厕所小便bbb| 色久综合一二码| 亚洲自拍偷拍图区| 精品视频1区2区| 视频在线在亚洲| 欧美一卡二卡在线观看| 久久99精品久久只有精品| 精品国产制服丝袜高跟| 国产精一品亚洲二区在线视频| 久久网站热最新地址| 久久超碰97中文字幕| 欧美不卡视频一区| 国产精品亚洲第一区在线暖暖韩国| 久久综合色天天久久综合图片| 国内成人免费视频| 2014亚洲片线观看视频免费| 美女视频一区二区| 久久综合成人精品亚洲另类欧美| 国产精品系列在线观看| 中文字幕乱码一区二区免费| 99热在这里有精品免费| 亚洲欧洲av在线| 欧美日韩和欧美的一区二区| 日韩制服丝袜av| 久久久噜噜噜久久中文字幕色伊伊| 国产一区999| 中文字幕不卡三区| 91日韩精品一区| 日本成人在线不卡视频| 久久在线免费观看| 9i看片成人免费高清| 午夜久久久久久| 国产性做久久久久久| 色偷偷久久一区二区三区| 亚洲午夜久久久久久久久电影院| 欧美日韩不卡视频| 韩国视频一区二区| 亚洲男人的天堂网| 日韩一级完整毛片| 成a人片亚洲日本久久| 亚洲国产精品欧美一二99| 日韩精品专区在线影院重磅| 国产成人免费xxxxxxxx| 亚洲精品老司机| 亚洲精品在线观| 91网址在线看| 极品瑜伽女神91| 一区二区在线免费观看| 精品国产在天天线2019| 欧美午夜电影一区| 国产v日产∨综合v精品视频| 夜夜操天天操亚洲| 久久久蜜桃精品| 欧美另类高清zo欧美| 国产盗摄女厕一区二区三区| 亚洲男人的天堂av| 久久久久久综合| 91麻豆精品国产91久久久使用方法| 国产成人免费在线| 免费在线欧美视频| 亚洲高清三级视频| 亚洲色图在线看| 日本一区二区三区在线观看| 91精品国产免费| 在线观看免费视频综合| 国产a精品视频| 国产资源在线一区| 青娱乐精品视频| 性做久久久久久久久| 中文字幕一区二区三区在线不卡 | 国产亚洲精品久| 日韩三级精品电影久久久| 91在线看国产| 成人激情图片网| 国产一区91精品张津瑜| 毛片av中文字幕一区二区| 亚洲国产精品久久久男人的天堂| 成人免费在线观看入口| 国产精品久久午夜| 国产精品日日摸夜夜摸av| 久久久久久久免费视频了| 久久你懂得1024| 国产欧美日韩精品一区| 国产女人水真多18毛片18精品视频| 精品区一区二区| 欧美成人欧美edvon| 欧美mv日韩mv| 日本一区二区三区电影| 国产欧美一区在线| 中日韩免费视频中文字幕| 欧美高清在线一区二区| 中文字幕亚洲视频| 亚洲精品成人a在线观看| 亚洲一区在线观看免费| 亚洲国产视频a| 日本成人在线网站| 国产精品系列在线观看| 97久久人人超碰| 欧美三区在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 在线观看日韩国产| 欧美视频一区在线观看| 91精品视频网| 国产欧美精品一区| 亚洲欧美日韩久久| 日韩1区2区3区| 国产精品综合av一区二区国产馆| eeuss影院一区二区三区| 欧美性猛交xxxx黑人交|