Beispiel #1
0
        /// <summary>
        /// 获取此实体对应的sql 查询字段 带属性别名
        /// </summary>
        /// <param name="tableAilasName"></param>
        /// <returns></returns>
        public string GetSqlQueryFieldsWithAlias(string tableAilasName = "")
        {
            string tableName = this.ResolveTableName(this);
            //----------尝试从静态字典中获取结构-----------
            string cacheKey = string.Concat(tableName, ":", tableAilasName, ":", "queryFields");

            return(SqlFieldMappingManager.GetSqlFieldNamesForQuery(cacheKey, () =>
            {
                var mapping = this.ResolveEntity(false);
                var fieldAlias = new List <string>();
                foreach (var item in mapping.Filelds)
                {
                    var ailasName = "";
                    if (!tableAilasName.IsNullOrEmpty())
                    {
                        ailasName = string.Format("{0}.`{1}` as `{2}`", tableAilasName, item.FieldColumnName, item.PropertyName);
                    }
                    else
                    {
                        ailasName = string.Format("`{0}` as `{1}`", item.FieldColumnName, item.PropertyName);
                    }
                    fieldAlias.Add(ailasName);
                }
                //string splitor = string.Format("{0},{0}", this.FieldWrapperChar);
                var fieldSplitString = string.Join(",", fieldAlias);

                if (!SqlFieldMappingManager.SqlFieldNamesForQuery.ContainsKey(cacheKey))
                {
                    SqlFieldMappingManager.SqlFieldNamesForQuery.TryAdd(cacheKey, fieldSplitString);
                }
                return fieldSplitString;
            }));
        }
Beispiel #2
0
        /// <summary>
        /// 解析实体   解析其中的关联的表+字段+字段参数
        /// </summary>
        /// <param name="isWriteCmd">是否是写入命令生成sql参数</param>
        internal SqlFieldMapping ResolveEntity(bool isWriteCmd)
        {
            var entity = this;


            string tableName = this.ResolveTableName(this);
            //----------尝试从静态字典中获取结构-----------
            string cacheKey = string.Concat(tableName, ":", Convert.ToInt32(isWriteCmd));

            return(SqlFieldMappingManager.GetEntityMapping(cacheKey, () =>
            {
                SqlFieldMapping mapping = new SqlFieldMapping();
                mapping.TableName = tableName;

                #region 解析实体


                //解析主键
                var targetPrimaryKeyAttribute = this.GetType().GetCustomAttribute <PrimaryKeyAttribute>();// this.GetType().GetCustomAttributes(typeof(PrimaryKeyAttribute), false);
                if (targetPrimaryKeyAttribute != null)
                {
                    var identityKeyModel = new EntityIdentity();
                    string name = targetPrimaryKeyAttribute.Name;
                    identityKeyModel.IdentityKeyName = name;
                    mapping.IdentityKey = identityKeyModel;
                }

                //获取所有字段
                var fullPropertys = this.GetType().GetProperties();
                //有效的db属性
                var lstDbUsedPropertys = new List <PropertyInfo>();

                var lstFilelds = new List <DbField>();//[propertys.Length];
                for (int i = 0; i < fullPropertys.Length; i++)
                {
                    var item = fullPropertys[i];
                    //将有忽略db的字段 排除
                    if (item.GetCustomAttribute <IgnoreDbFieldAttribute>() != null)
                    {
                        continue; //忽略属性
                    }
                    if (isWriteCmd == true)
                    {
                        var writeAttr = item.GetCustomAttribute <WriteAttribute>();
                        if (null != writeAttr && writeAttr.Write == false)
                        {
                            continue; //如果是非写入参数,那么忽略此属性作为sql 参数
                        }
                    }
                    lstDbUsedPropertys.Add(item);

                    //解析属性上的标注 CloumnAttribute

                    string fieldName = item.Name;

                    var colAttr = item.GetCustomAttribute <ColumnAttribute>();
                    if (null != colAttr && !colAttr.Name.IsNullOrEmpty())
                    {
                        fieldName = colAttr.Name; //如果有自定义的ColumnAttribute
                    }
                    lstFilelds.Add(new DbField {
                        PropertyName = item.Name, FieldColumnName = fieldName
                    });
                }
                //db 字段CLR 属性
                mapping.Propertys = lstDbUsedPropertys.ToArray();
                //字段
                mapping.Filelds = lstFilelds;

                //参数字段
                mapping.SqlParas = mapping.Filelds.Select(x => x.PropertyName).ToArray();
                for (int i = 0; i < mapping.SqlParas.Length; i++)
                {
                    mapping.SqlParas[i] = string.Concat("@", mapping.SqlParas[i]);
                }
                #endregion

                //保存到Mapping缓存

                if (!SqlFieldMappingManager.Mappings.ContainsKey(cacheKey))
                {
                    SqlFieldMappingManager.Mappings.TryAdd(cacheKey, mapping);
                }

                return mapping;
            }));
        }