本章我們主要講解如何實作一個複雜的查詢。由于目前TinyFrame架構已經投入到了實際的項目生産中,是以我很樂意将項目中遇到的任何問題做以記錄并備忘。
這章中,我們提到的查詢界面如下所示:
其中,涉及到聯查,單查;對于聯查部分,選中”所屬區域“後,才會加載”所屬基地“内容,選中”所屬基地“後,才會加載”所屬裝置“内容,選中”所屬裝置“後才會加載”檢索參數“内容。其他的項會在頁面加載的時候就被填充了。由于複雜的查詢要涉及很多表的聯查,是以不可能做成通用的,是以在這裡,利用代碼生成器來生成複雜的查詢操作是最靠譜的。這是後話,我們今天主要來看看利用TinyFrame架構如何來實作複雜的查詢功能:
首先,我們定義一個查詢接口:
然後,下面是其實作部分:
第48~55行,主要是擷取資料對象操作。由于TinyFrame提供了豐富的資料對象擷取行為,是以這裡想拿什麼對象,就拿什麼對象。
第60行及其以後的行,主要是用來判斷目前查詢中有無值,如果有值,就進行過濾,如果沒有值就不進行任何操作。由于Repository中的GetMany方法支援Linq操作,是以這裡做過濾的時候,感覺非常輕松,同時由于EF的導航屬性,使用起來就更加便捷了。
第114行主要是用來檢測參數的,如果使用者未選擇任何項進行過濾,則預設加載全部資料。
第119行主要是用來定義緩存的Key 。
第120行主要是用來擷取資料并傳回,如果在Cache中存在資料,則直接命中傳回;反之,則從資料庫擷取後,儲存到緩存中,然後傳回給前台頁面。
最後,在Controller中,我們的調用就簡單的多:
上面代碼中:
第32行,主要是調用我們的方法來傳回查詢的結果集。
第39行,主要是将目前的實體類進行一下重組,以便于滿足前台頁面的顯示。
第57行,主要是用來構造JSON字串。
第62行及其之後,傳回JsonResult到前台。
這樣做完之後,Controller就已經把實體類都準備好了,下面部分就是進行前台組織調用了:
第53行,主要用來動态加載”所屬區域“下拉清單。
第65行,主要用來根據所選的”所屬區域“值,來動态加載”所屬基地“下拉清單。
第77行,主要用來加載”裝置類型”下拉清單。
第87行,主要用來根據所選的“所屬基地”值,來動态加載“所屬裝置”下拉清單。
第99行,主要用來根據所選的“所屬裝置”值,來動态加載“檢索參數”下拉清單。
第30行,主要用來送出組合查詢,通過将其組合成JSON串傳回給Controller進行控制。
需要注意的是,在EasyUI中,如果想讓DataGrid的自定義參數傳回給Controller,隻需要利用
即可實作(注意上邊代碼中的黃色背景标注部分),在背景隻需要通過:
即可擷取。
最後看看我們的查詢結果:
最後附上下載下傳: