详细解说NParsing框架实现原理 —— 3)排序组件(ObSort)

因为最近工作比较忙,一直没时间写NParsing框架的解说文章。不过我已经提供了框架及Demo的下载,相信看过Demo的朋友,也已经了解了每个组件的大概功能。下面就来说说排序组件(ObSort)。

数据库记录排序大家都非常熟悉,ORDER BY xxx ASC/DESC。NParsing框架中的排序也就是封装实现了SQL语句ORDER BY,实现要注意以下几点:
1、多字段排序。
2、多字段顺序/倒序组合排序。
3、支持不同数据库平台(虽然说目前这四种数据库的排序语法是完全一样的,但我还是用接口,在不同的数据库操作类库中实现了,主要是为了更好的为第五第六种数据库平台扩充做准备)。
4、跟参数组件(ObParameter)一样,延迟生成。

先看接口吧

 1  using  System.Collections.Generic;
 2  using  DotNet.Frameworks.NParsing.Utilities;
 3 
 4  namespace  DotNet.Frameworks.NParsing.Interface
 5  {
 6       public   interface  IObSort
 7      {
 8           ///   <summary>
 9           ///  排序字段列表
10           ///   </summary>
11          IList < DbSort >  List {  get set ; }
12 
13           ///   <summary>
14           ///  添加一个排序参数
15           ///   </summary>
16           ///   <typeparam name="M"></typeparam>
17           ///   <param name="propertyName"> 属性名 </param>
18           ///   <param name="isAsc"></param>
19           ///   <returns></returns>
20          IObSort Add < M > ( string  propertyName,  bool  isAsc);
21 
22           ///   <summary>
23           ///  获取排序字符串
24           ///   </summary>
25           ///   <returns></returns>
26           string  ToString();
27      }
28  }

 

一、我是如何实现多字段排序的?
    很简单,使用Add方法增加排序字段名,用一个IList成员变量保存,在控制器组件接用数据库操作方法时,使用ToString方法转成SQL语句。
    看一下实方法

 1  ///   <summary>
 2  ///  创建排序(顺序)
 3  ///   </summary>
 4  ///   <typeparam name="M"></typeparam>
 5  ///   <param name="propertyName"> 属性名 </param>
 6  ///   <returns></returns>
 7  public   static  IObSort Create < M > ( string  propertyName)
 8  {
 9       return  Create < M > (propertyName,  true );
10  }
11 
12  ///   <summary>
13  ///  创建排序
14  ///   </summary>
15  ///   <typeparam name="M"></typeparam>
16  ///   <param name="propertyName"> 属性名 </param>
17  ///   <param name="isAsc"> true 顺序, false 倒序 </param>
18  ///   <returns></returns>
19  public   static  IObSort Create < M > ( string  propertyName,  bool  isAsc)
20  {
21       string  tableName  =   typeof  (M).Name.ToTableName();
22       #if  (DEBUG)
23       if  ( ! typeof (M).Exists(propertyName))
24      {
25           throw   new  Exception( string .Format( " {0}.{1}属性名未找到 " , tableName, propertyName));
26      }
27       #endif
28      Type t  =  Assembly.Load(ASSEMBLY_STRING).GetType(CLASS_NAME);
29      var parameters  =   new   object []
30                           {
31                               tableName,
32                               propertyName,
33                               isAsc
34                           };
35       return  (IObSort) Activator.CreateInstance(t, parameters);
36  }

 

 1  public  ObSort( string  tableName,  string  columnName,  bool  isAsc)
 2  {
 3      List.Add( new  DbSort(tableName, columnName, isAsc));
 4  }
 5 
 6  public   override  IObSort Add < M > ( string  propertyName,  bool  isAsc)
 7  {
 8      List.Add( new  DbSort( typeof (M).Name, propertyName, isAsc));
 9       return   this ;
10  }

 

二、我是如何实现多字段顺序/倒序组合排序?
    我们可以看到,在Add方法不但有一个属性名的参数,还有一个是否顺序(isAsc)的参数。让每个增加排序的字段名都赋予排序的方式,使在ToString时,能够拼接成ORDER BY x1, x2 ASC, x3, x4 DESC这样的SQL。

    实现方法

 1  public   override   string  ToString()
 2  {
 3       string  strSqlOrderAsc  =   string .Empty;
 4       string  strSqlOrderDesc  =   string .Empty;
 5       foreach  (DbSort dbSort  in  List)
 6      {
 7           if  (dbSort.IsAsc)
 8          {
 9               if  (strSqlOrderAsc.Length  >   0 )
10                  strSqlOrderAsc  +=   " , " ;
11              strSqlOrderAsc  +=   string .Format( " {0}.{1} " , dbSort.TableName, dbSort.ColumnName);
12          }
13           else
14          {
15               if  (strSqlOrderDesc.Length  >   0 )
16                  strSqlOrderDesc  +=   " , " ;
17              strSqlOrderDesc  +=   string .Format( " {0}.{1} " , dbSort.TableName, dbSort.ColumnName);
18          }
19      }
20       if  (strSqlOrderAsc.Length  >   0   &&  strSqlOrderDesc.Length  >   0 )
21      {
22           return  strSqlOrderAsc  +   "  ASC, "   +  strSqlOrderDesc  +   "  DESC " ;
23      }
24       if  (strSqlOrderAsc.Length  >   0 )
25      {
26           return  strSqlOrderAsc  +   "  ASC " ;
27      }
28       if  (strSqlOrderDesc.Length  >   0 )
29      {
30           return  strSqlOrderDesc  +   "  DESC " ;
31      }
32       return   "" ;
33  }

 

三、我是如何支持不同数据库平台的?
四、我是如何延迟生成的?
    在这里不多说了,看过前面文章的朋友应该都知道。

 

    本框架我也是在不断完善中,欢迎大家给我保贵意见。刚在前不久,为框架新添了一个组件“分组组件(ObGroup)”,用来对数据库记录进行分组提取,同时支持聚合函数。

 

注:NParsing框架及Demo程序,将会在“引言(NParsing框架功能简介、NParsing的由来) ”中提供下载。

 

详细解说NParsing框架实现原理 —— 2)参数组件(ObParameter)

详细解说NParsing框架实现原理 —— 1)控制器组件(ObHelper)

引言(NParsing框架功能简介、NParsing的由来)

转载于:https://www.cnblogs.com/zhidian/archive/2010/05/21/1741247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值