/// <summary>
        /// 获取实体sql信息
        /// </summary>
        /// <returns>实体sql信息</returns>
        private EntitySqlInfo GetEntitySqlInfo()
        {
            EntitySqlInfo _info = (EntitySqlInfo)s_table[typeof(T).FullName];

            //_info = null
            if (_info == null)
            {
                // 用于支持扩展列的表名
                _info = new EntitySqlInfo();
                //_info.TableName = string.Format("[{0}]", typeof(T).Name);
                _info.TableName = string.Format("{0}", typeof(T).Name);
                // 如果有别名,则使用别名
                DataEntityAttribute attribute = typeof(T).GetMyAttribute <DataEntityAttribute>();

                if (attribute != null && !string.IsNullOrEmpty(attribute.Alias))
                {
                    //_info.TableName = string.Format("[{0}]", attribute.Alias);
                    _info.TableName = string.Format("{0}", attribute.Alias);
                }
                // 获取字段名
                foreach (PropertyInfo prop in typeof(T).GetProperties())
                {
                    TransferProperty(prop, _info);
                }

                s_table[typeof(T).FullName] = _info;
            }

            return(_info);
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="type">命令类型</param>
        /// <param name="argsObject">参数</param>
        /// <param name="filter">过滤条件(参数化sql的过滤条件语句)</param>
        public StandardXmlCommand(XmlCommandType type, object argsObject, string filter)
        {
            _sqlInfo = GetEntitySqlInfo();
            var sql = new StringBuilder();

            sql.AppendFormat("select {0} from {1} where 1=1", _sqlInfo.Properties.Join(","), _sqlInfo.TableName + " " + _sqlInfo.ExtendTables.Join(" "));
            List <SqlParameter> parameterList = new List <SqlParameter>();

            switch (type)
            {
            case XmlCommandType.GetSingle:
                sql.AppendFormat(" and {0}=@oid", _sqlInfo.PrimaryKey);
                parameterList.Add(new SqlParameter()
                {
                    ParameterName = "@oid",
                    DbType        = DbType.Guid,
                    Direction     = ParameterDirection.Input,
                    Size          = 0
                });
                break;

            case XmlCommandType.GetList:
            case XmlCommandType.GetPageList:
                break;

            case XmlCommandType.GetListByIds:
                sql.AppendFormat(" and {0} IN (SELECT AllItem FROM dbo.fn_split(@oids,','))", _sqlInfo.PrimaryKey);
                parameterList.Add(new SqlParameter()
                {
                    ParameterName = "@oids",
                    DbType        = DbType.String,
                    Direction     = ParameterDirection.Input,
                    Size          = 0
                });
                break;

            case XmlCommandType.GetCount:
                sql = new StringBuilder();
                sql.AppendFormat("select count(1) from {0} where 1=1", _sqlInfo.TableName);
                break;
            }

            if (!string.IsNullOrEmpty(filter))
            {
                sql.AppendFormat(" and {0}", filter);
                Regex reg = new Regex(@"[^@@](?<p>@\w+)");

                if (argsObject != null)
                {
                    PropertyInfo[] argProps = argsObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

                    foreach (Match m in reg.Matches(filter))
                    {
                        // 跳过同名参数
                        if (parameterList.Count(p => p.ParameterName == m.Groups["p"].Value) > 0)
                        {
                            continue;
                        }

                        var argProp = argProps.FirstOrDefault(p => "@" + p.Name == m.Groups["p"].Value);
                        parameterList.Add(new SqlParameter()
                        {
                            ParameterName = m.Groups["p"].Value,
                            DbType        = CSharp2DbType(argProp.PropertyType.GetRealType()),
                            Direction     = ParameterDirection.Input,
                            Size          = 0
                        });
                    }
                }
            }

            SqlParameter[] parameters = GetParameters(parameterList, argsObject);

            _query = CPQuery.From(sql.ToString(), parameters);
            _query.Command.CommandTimeout = 30;
            _query.Command.CommandType    = CommandType.Text;
        }
        /// <summary>
        /// 转换属性
        /// </summary>
        /// <param name="info">属性</param>
        /// <param name="entity">实体Sql信息</param>
        private void TransferProperty(PropertyInfo info, EntitySqlInfo entity)
        {
            DataColumnAttribute attrColumn = info.GetMyAttribute <DataColumnAttribute>();

            if (attrColumn != null)
            {
                var prop = "";
                if (!string.IsNullOrEmpty(attrColumn.Alias))
                {
                    prop = string.Format("{0}.[{1}]", entity.TableName, attrColumn.Alias);
                }
                else
                {
                    prop = string.Format("{0}.[{1}]", entity.TableName, info.Name);
                }
                entity.Properties.Add(prop);
                if (attrColumn.PrimaryKey)
                {
                    entity.PrimaryKey = prop;
                }
            }
            else
            {
                ExtendColumnAttribute attrExtColumn = info.GetMyAttribute <ExtendColumnAttribute>();
                if (attrExtColumn != null && attrExtColumn.ColumnType != 0)
                {
                    switch (attrExtColumn.ColumnType)
                    {
                    case ExtendColumnTypeEnum.KeyParamOption_Code:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN dbo.KeyParamOption AS {0} ON [{0}].[Code] = {1}.[{2}] AND [{0}].[ParamGroup] = '{3}'", info.Name, entity.TableName, attrExtColumn.RelationColumn, attrExtColumn.Expression));
                        entity.Properties.Add(string.Format("[{0}].[Name] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.KeyParamOption_Guid:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN dbo.KeyParamOption AS {0} ON [{0}].[KeyParamOptionID] = {1}.[{2}]", info.Name, entity.TableName, attrExtColumn.RelationColumn));
                        entity.Properties.Add(string.Format("[{0}].[Name] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.UserName_Guid:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN {0}.dbo.ORG_UserInfo AS {1} ON [{1}].[UserGUID] = {2}.[{3}]", ConnStringHelper.GetDBName("SystemCore"), info.Name, entity.TableName, attrExtColumn.RelationColumn));
                        entity.Properties.Add(string.Format("[{0}].[UserName_Chn] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.UserName_Code:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN {0}.dbo.ORG_UserInfo AS {1} ON [{1}].[UserCode] = {2}.[{3}]", ConnStringHelper.GetDBName("SystemCore"), info.Name, entity.TableName, attrExtColumn.RelationColumn));
                        entity.Properties.Add(string.Format("[{0}].[UserName_Chn] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.BusinessUnit_Guid:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN {0}.dbo.ORG_BusinessUnit AS {1} ON [{1}].[BUGUID] = {2}.[{3}]", ConnStringHelper.GetDBName("SystemCore"), info.Name, entity.TableName, attrExtColumn.RelationColumn));
                        entity.Properties.Add(string.Format("[{0}].[BUName] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.BusinessUnit_Code:
                        entity.ExtendTables.Add(string.Format("LEFT JOIN {0}.dbo.ORG_BusinessUnit AS {1} ON [{1}].[BUCode] = {2}.[{3}]", ConnStringHelper.GetDBName("SystemCore"), info.Name, entity.TableName, attrExtColumn.RelationColumn));
                        entity.Properties.Add(string.Format("[{0}].[BUName] AS {0}", info.Name));
                        break;

                    case ExtendColumnTypeEnum.Common:
                        entity.ExtendTables.Add(attrExtColumn.Expression);
                        entity.Properties.Add(attrExtColumn.RelationColumn);
                        break;
                    }
                }
            }
        }