详细解说NParsing框架实现原理 —— 3)排序组件(ObSort)
因为最近工作比较忙,一直没时间写NParsing框架的解说文章。不过我已经提供了框架及Demo的下载,相信看过Demo的朋友,也已经了解了每个组件的大概功能。下面就来说说排序组件(ObSort)。
数据库记录排序大家都非常熟悉,ORDER BY xxx ASC/DESC。NParsing框架中的排序也就是封装实现了SQL语句ORDER BY,实现要注意以下几点:
1、多字段排序。
2、多字段顺序/倒序组合排序。
3、支持不同数据库平台(虽然说目前这四种数据库的排序语法是完全一样的,但我还是用接口,在不同的数据库操作类库中实现了,主要是为了更好的为第五第六种数据库平台扩充做准备)。
4、跟参数组件(ObParameter)一样,延迟生成。
先看接口吧
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语句。
看一下实方法
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 }
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。
实现方法
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)