详细解说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 { getset; }
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的由来)

posted @ 2010-05-21 22:40  支点  阅读(1435)  评论(2编辑  收藏  举报