YbSoftwareFactory 代碼生成插件【十四】:經過 DynamicLinq 簡單實現 N-Tier 部署下的服務端數據庫通用分頁

    YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.NET做爲業務層,CSLA.NET的一個強大的特性是支持 N-Tiers 部署。只需很是簡單的配置就能在本1-Tier部署方式和N-Tiers部署方式之間切換,這個過程無需編寫任何額外的代碼,這對於 WinForm 和 WPF 等客戶端的開發來講是很是重要的特性,更多信息請參考我前面的文章:YbSoftwareFactory 代碼生成插件【七】:YbRapidSolution for WinForm 插件生成項目整體架構介紹。但衆所周知,VS 在 WinForm 的開發環境下沒有提供相應的分頁控件,網上不少針對實現的分頁控件雖然實現了數據庫分頁但每每也要丟失一些在WinForm下的重要特性,通用性和易用性都稍差。本文描述了經過 DynamicLinq 來實現很是方便的自定義過濾條件和自定義排序規則的服務器端數據庫分頁,並提供 DynamicLinq 的代碼下載。html

    YbRapidSolution for WinForm 插件解決方案的界面層使用DevExpress,DevExpress 的 GridContro l控件比 VS 自帶的 DataGridView 不知強大多少倍,自定義過濾、分組、統計、列選擇等一鼓作氣,甚至連數據的導出也很是的全面和方便。但若是不進行數據庫分頁的話每每性能低下,DevExpreess 能夠經過實現 IListserver 提高大數量下的性能,但在 N-Tier 模式下實現的難度和複雜程度超乎想象,咱們此處將經過採用折中的解決方案。數據庫

    在我前面介紹的 YbRapidSolution for MVC 插件中,已經使用了  DynamicLinq 來進行查詢、分頁和排序,而在 WinForm 插件中咱們一樣使用 DynamicLinq 來實現相似的分頁效果。經過使用 DynamicLinq 後,不只保留了 DevExpress 的GridControl 控件的一些主要特性,性能的提高也是顯而易見的。首先來看看幾張分頁效果的大圖:api

    一、 分頁整體效果圖(服務層端的數據庫分頁):服務器

     二、 可任意列進行排序架構

    三、可自定義查詢條件,注意此處但是跨表查詢性能

    四、支持組合查詢和其餘字段類型 spa

 

    本方案的實現效果很好,也很是靈活,全部的分頁數據均來源於服務層而不是直接來源於數據層。更關鍵的是所需的代碼量極少,以下就是本模塊的簡單的分頁調用代碼:插件

 1  public OrdersList Fetch(PagerCriteria criteria)
 2         {
 3              var result =  new OrdersList();
 4             result.RaiseListChangedEvents =  false;
 5             SetIsReadOnly(result,  false);
 6              var data = _repository.Table;
 7              if (! string.IsNullOrWhiteSpace(criteria.Filter1))
 8             {
 9                 data = data.Where(criteria.Filter1);
10             }
11             result.TotalRowCount = data.Count();
12              if ( string.IsNullOrWhiteSpace(criteria.Sort))
13             {
14                 criteria.Sort =  " OrderID ";
15             }
16             data = data.OrderBy( string.Format( " {0} {1} ", criteria.Sort, criteria.Order));
17              if (criteria.Page <=  0
18                 criteria.Page =  1;
19              var items = data.Skip((criteria.Page -  1) * criteria.Rows).Take(criteria.Rows).ToList();
20             
21              foreach ( var item  in items)
22             {
23                 result.Add(EntityToBusinessObject(item));
24             }
25 
26             result.RaiseListChangedEvents =  true;
27             SetIsReadOnly(result,  true);
28 
29              return result;
30         

    同時附上即將實現的一個流程設計器界面:設計

    在下一章中,咱們將介紹如何實現屬性自動擴展並可方便地從數據庫中加載和保存的解決方案。code

    附件:DynamicLinq 下載地址: DynamicLinq
相關文章
相關標籤/搜索