這是我的第二篇文章,這是我之前做的erp專案的時候設計實現的。在這個erp系統中,功能比較多,表設計的時候建立了很多業務表。對於一些業務表需要執行很多查詢,客戶要求針對不同的字段進行查詢,基於我們之前的設計,針對不同的查詢條件設計不同的dal方法,通過不同的方法簽名來實現客戶的對於不同條件查詢的要求。但是這種解決方案會讓程式設計師很被動,久而久之整個dal層會顯得很臃腫。
面對這樣的困境,考慮是否可以實現用乙個通用的dal方法來代替所有的不同篩選條件查詢方法,因為這些查詢方法內部的邏輯是一樣的,只有查詢條件不一樣。
組合查詢的意思就是,dal方法不需要知道客戶的具體查詢條件是什麼,就可以向客戶返回乙個結果集。要實現組合查詢需要實現以下幾個步驟:
(1) 建立工具類predicateextensionses
1predicateextensionsespublic
static
class
predicateextensionses24
5public
static expressionbool>> false() 67
public
static expressionbool>> or(this expressionbool>> exp_flow, expressionbool>>expression2)815
16public
static expressionbool>> and(this expressionbool>> exp_flow, expressionbool>>expression2)
1724 }
(2) 將查詢條件封裝成model類
1modelpublic
class
filter24
5public
string filter2 67
public
string filter3
8 }
(3) 組合查詢方法
組合查詢的時候,需要對客戶提供的查詢條件做乙個處理,將有效的查詢的條件進行組裝,有效是指string型別的變數不為空或者null、int型別變數值不為0等等。
1getresultsbyfilter//model是使用linq to sql生成的資料表對應的資料類名
2public
void getresultsbyfilter(filter filter, out ilistresults)312
}1314//
組合查詢條件
15private
void getfiltercondition(filter filter, ref expressionbool>>expr)
1621
if (!string
.isnullorempty(filter.filter2))
2225
if (!string
.isnullorempty(filter.filter3))
26
29 }
方法簽名中的filter類是自定義篩選條件類,這個根據客戶的查詢要求來定義。model類是資料類,是有ling to sql工具生成的類。查詢得到的結果通過out引用引數返回。
組合查詢的實現
create proc test username char 10 user char 2 useraddress varchar 100 as declare sqlstr varchar 1000 set sqlstr select top 100 from datatable where 1 ...
sql模糊查詢實現組合查詢
資料庫程式設計中經常遇到組合查詢的情況。例如,某公司資料庫裡有一張存放使用者資訊的表user info,它有多個字段 userid,id,name,age,address。其中userid是表的主碼,表示使用者的使用者號,該使用者號對每個使用者都是唯一的 id表示使用者省份證號。此時要對使用者資訊進...
關於組合查詢的實現
示範中心有一項功能是組合查詢,就是在現有資料 例如教師 實驗室 實驗專案 中過濾出感興趣的資料。因為資料的型別比較多,大約有十個,為每種型別都做一套查詢介面和對應的action 很不划算。我打算通過配置檔案的方式,為每個型別的資料都需要對哪些屬性進行過濾進行說明,並且說明每個屬性在介面上表現為文字框...