通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页

通过 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 的代码下载。

    YbRapidSolution for WinForm 插件解决方案的界面层使用DevExpress,DevExpress 的 GridContro l控件比 VS 自带的 DataGridView 不知强大多少倍,自定义过滤、分组、统计、列选择等一气呵成,甚至连数据的导出也非常的全面和方便。但如果不进行数据库分页的话往往性能低下,DevExpreess 可以通过实现 IListserver 提升大数量下的性能,但在 N-Tier 模式下实现的难度和复杂程度超乎想象,我们此处将通过采用折中的解决方案。

    在我前面介绍的 YbRapidSolution for MVC 插件中,已经使用了  DynamicLinq 来进行查询、分页和排序,而在 WinForm 插件中我们同样使用 DynamicLinq 来实现类似的分页效果。通过使用 DynamicLinq 后,不仅保留了 DevExpress 的GridControl 控件的一些主要特性,性能的提升也是显而易见的。首先来看看几张分页效果的大图:

    1、 分页总体效果图(服务层端的数据库分页):

     2、 可任意列进行排序

    3、可自定义查询条件,注意此处可是跨表查询

    4、支持组合查询和其他字段类型 

 

    本方案的实现效果很好,也非常灵活,所有的分页数据均来源于服务层而不是直接来源于数据层。更关键的是所需的代码量极少,如下就是本模块的简单的分页调用代码:

复制代码
 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         
复制代码

    同时附上即将实现的一个流程设计器界面:

    在下一章中,我们将介绍如何实现属性自动扩展并可方便地从数据库中加载和保存的解决方案。

    附件:DynamicLinq 下载地址:DynamicLinq
 
原文地址:https://www.cnblogs.com/Leo_wl/p/3225004.html