• 详细解说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的由来)

  • 相关阅读:
    PPT能输英文不能输汉字
    常用HTML正则表达式
    Log4j使用总结
    JsonConfig过滤对象属性
    打开”我的电脑“,不显示”共享文档“和”我的文档“,解决办法。(windows XP系统)
    错误org.hibernate.LazyInitializationException
    Tomcat中实现IP访问限制
    windows server 2008中让AD域中的普通用户可以 远程登录 域控服务器。
    ibatis简介及 like查询
    IE访问页面的时候,受限制的解决方案。
  • 原文地址:https://www.cnblogs.com/zhidian/p/1741247.html
Copyright © 2020-2023  润新知