/// <summary>
        /// 按指定列排序并返回当前语句
        /// </summary>
        /// <typeparam name="T">实体类类型</typeparam>
        /// <param name="cmd">查询语句</param>
        /// <param name="expr">实体类属性</param>
        /// <param name="orderType">排序类型</param>
        /// <exception cref="ExpressionInvalidException">表达式不正确</exception>
        /// <exception cref="NullAttributeException">没有设置特性</exception>
        /// <returns>当前语句</returns>
        /// <example>
        /// <code lang="C#">
        /// <![CDATA[
        /// public class UserRepository : DatabaseTable<User>
        /// {
        ///     //other necessary code
        ///
        ///     public List<User> GetAllEntities()
        ///     {
        ///         return this.Select()
        ///             .Querys<User>(c => new { c.UserID, c.UserName })
        ///             .OrderBy<User>(c => c.UserID, SqlOrderType.Desc)
        ///             .ToEntityList<User>(this);
        ///
        ///         //SELECT UserID, UserName From tbl_Users ORDER BY UserID DESC
        ///     }
        /// }
        /// ]]>
        /// </code>
        /// </example>
        public static SelectCommand OrderBy <T>(this SelectCommand cmd, Expression <Func <T, Object> > expr, SqlOrderType orderType)
        {
            DatabaseColumnAttribute attr = SelectCommandExtension.GetColumnAttribute(cmd, expr.Body);
            String tableName             = EntityHelper.InternalGetTableName(typeof(T));

            return(cmd.OrderBy(tableName, attr.ColumnName, orderType));
        }
        /// <summary>
        /// 分组指定字段名并返回当前语句
        /// </summary>
        /// <typeparam name="T">实体类类型</typeparam>
        /// <param name="cmd">查询语句</param>
        /// <param name="expr">实体类属性</param>
        /// <exception cref="ExpressionInvalidException">表达式不正确</exception>
        /// <exception cref="NullAttributeException">没有设置特性</exception>
        /// <returns>当前语句</returns>
        /// <example>
        /// <code lang="C#">
        /// <![CDATA[
        /// public class UserRepository : DatabaseTable<User>
        /// {
        ///     //other necessary code
        ///
        ///     public DataTable GetAllEntities()
        ///     {
        ///         return this.Select()
        ///             .Querys<User>(c => new { c.UserType })
        ///             .GroupBy<User>(c => c.UserType)
        ///             .ToDataTable(this);
        ///
        ///         //SELECT UserType From tbl_Users GROUP BY UserType
        ///     }
        /// }
        /// ]]>
        /// </code>
        /// </example>
        public static SelectCommand GroupBy <T>(this SelectCommand cmd, Expression <Func <T, Object> > expr)
        {
            DatabaseColumnAttribute attr = SelectCommandExtension.GetColumnAttribute(cmd, expr.Body);

            return(cmd.GroupBy(attr.ColumnName));
        }
        /// <summary>
        /// 查询指定字段名并返回当前语句
        /// </summary>
        /// <typeparam name="T">实体类类型</typeparam>
        /// <param name="cmd">查询语句</param>
        /// <param name="expr">实体类属性</param>
        /// <param name="function">合计函数类型</param>
        /// <param name="aliasesName">字段名的别名</param>
        /// <exception cref="ExpressionInvalidException">表达式不正确</exception>
        /// <exception cref="NullAttributeException">没有设置特性</exception>
        /// <returns>当前语句</returns>
        /// <example>
        /// <code lang="C#">
        /// <![CDATA[
        /// public class UserRepository : DatabaseTable<User>
        /// {
        ///     //other necessary code
        ///
        ///     public Int32 Count()
        ///     {
        ///         return this.Select()
        ///             .Query<User>(c => c.UserID, SqlAggregateFunction.Count, "UserCount")
        ///             .Result<Int32>();
        ///
        ///         //SELECT COUNT(UserID) AS UserCount From tbl_Users
        ///     }
        /// }
        /// ]]>
        /// </code>
        /// </example>
        public static SelectCommand Query <T>(this SelectCommand cmd, Expression <Func <T, Object> > expr, SqlAggregateFunction function, String aliasesName)
        {
            DatabaseColumnAttribute attr = SelectCommandExtension.GetColumnAttribute(cmd, expr.Body);

            return(cmd.Query(function, attr.ColumnName, aliasesName));
        }