Пример #1
0
        /// <summary>
        /// 根据主键查询,主键类型自定义
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="criteria"></param>
        /// <returns></returns>
        public async Task <T> QueryByPk <T>(T criteria) where T : class, new()
        {
            if (criteria == null)
            {
                throw new DalException(ErrorCode.PrimaryKeyIsEmpty, "Query criteria is empty");
            }

            var info        = EntityMetaDataMapper.GetInstance().Get <T>();
            var primaryKeys = info.Columns.FindAll(p => p.Attribute.PrimaryKey == true);

            // 再一次校验是否是所有的主键都进行了设置
            foreach (var pk in primaryKeys)
            {
                if (pk.ColumnProperty.GetValue(criteria) == null)
                {
                    throw new DalException(ErrorCode.PrimaryKeyIsEmpty, $"Query primary key is empty : {pk.Attribute.Name}");
                }
            }

            var list = await Query <T>(criteria);

            if (list == null || list.Count == 0)
            {
                return(null);
            }

            return(list[0]);
        }
Пример #2
0
        /// <summary>
        /// 获取Where条件只有主键的查询条件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="criteria"></param>
        /// <returns></returns>
        private static (string, List <DatabaseParameter>) GeneratePrimaryKeyClause <T>(T criteria)
        {
            var parameters = new List <DatabaseParameter>();
            var sb         = new StringBuilder(" WHERE ");
            var info       = EntityMetaDataMapper.GetInstance().Get <T>();

            var primaryKeys = info.Columns.FindAll(p => p.Attribute.PrimaryKey == true);

            foreach (var pk in primaryKeys)
            {
                sb.Append($"`{pk.Attribute.Name}` = ?");
                sb.Append(" AND ");

                // 主键不能为空
                var value = pk.ColumnProperty.GetValue(criteria);
                if (value == null)
                {
                    throw new DalException(ErrorCode.InvalidSqlParameters,
                                           $"Primary key can not be empty : {pk.Attribute.Name}");
                }
                ;

                parameters.Add(new DatabaseParameter()
                {
                    Name  = pk.Attribute.Name,
                    Value = value
                });
            }

            sb.Remove(sb.Length - 4, 4);
            sb.Append(";");

            return(sb.ToString(), parameters);
        }
Пример #3
0
        private T BuildCriteria <T, PKType>(PKType value) where T : class, new()
        {
            if (value == null)
            {
                throw new DalException(ErrorCode.PrimaryKeyIsEmpty, "Primary key is empty");
            }

            var info = EntityMetaDataMapper.GetInstance().Get <T>();

            // 检查主键类型,必须为字符串
            var identity = info.Columns.Find(p => p.Attribute.PrimaryKey == true);
            var property = identity.ColumnProperty.PropertyType;

            if (property == typeof(PKType) ||
                (property.IsGenericType &&
                 property.GetGenericTypeDefinition() == typeof(Nullable <>) &&
                 property.GetGenericArguments()[0] == typeof(PKType)))
            {
                var criteria = new T();
                identity.ColumnProperty.SetValue(criteria, value);

                return(criteria);
            }

            throw new DalException(ErrorCode.PrimaryKeyIsEmpty,
                                   $"Primary key type mismatch, source type : {typeof(PKType)}, " +
                                   $"target type : {identity.ColumnProperty.PropertyType}");
        }
Пример #4
0
        public async Task <List <T> > QueryLike <T>(IDatabaseParameterLink link, int?recordCount = null) where T : class, new()
        {
            var mapper = EntityMetaDataMapper.GetInstance();

            // 获取组装好的sql和参数
            (string sql, List <DatabaseParameter> parameters) =
                SqlBuilderFactory.GetInstance <T>().BuildSelect <T>(link, recordCount);
            var dataSet = await DalClientFactory.GetClient(GetLogicDatabaseName <T>()).Query(sql, parameters);

            return(mapper.Convert <T>(dataSet));
        }
Пример #5
0
        public (string, List <DatabaseParameter>) BuildSelect <T>(T criteria, int?recordCount) where T : new()
        {
            var info = EntityMetaDataMapper.GetInstance().Get <T>();

            var sb = new StringBuilder(GetPrimarySql <T>());

            if (criteria == null)
            {
                sb.Append(";");
                return(sb.ToString(), null);
            }

            var parameters       = new List <DatabaseParameter>();
            var isFirstCondition = true;

            foreach (var column in info.Columns)
            {
                var value = column.ColumnProperty.GetValue(criteria);
                if (value == null)
                {
                    continue;
                }

                if (isFirstCondition == true)
                {
                    sb.Append(" WHERE ");
                    isFirstCondition = false;
                }
                else
                {
                    sb.Append(" AND ");
                }

                parameters.Add(new DatabaseParameter
                {
                    Name  = column.Attribute.Name,
                    Value = value
                });

                sb.Append($"`{column.Attribute.Name}` = ?");
            }

            if (recordCount != null && recordCount > 0)
            {
                sb.Append($" limit {recordCount};");
            }
            else
            {
                sb.Append(";");
            }

            return(sb.ToString(), parameters);
        }
Пример #6
0
        /// <summary>
        /// 根据泛型T,组装该类型的查询语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static ISqlBuilder GetInstance <T>()
        {
            var info      = EntityMetaDataMapper.GetInstance().Get <T>();
            var dalClient = DalClientFactory.GetClient(info.DatabaseName);

            if (!sqlBuilders.ContainsKey(dalClient.DatabaseType))
            {
                throw new DalException(ErrorCode.SqlBuilderNotFound, $"There's no sql builder for {dalClient.DatabaseType}");
            }

            return(sqlBuilders[dalClient.DatabaseType]);
        }
Пример #7
0
        private string GetLogicDatabaseName <T>() where T : class, new()
        {
            var entityInfo = EntityMetaDataMapper.GetInstance().Get <T>();

            var logicName = databaseName;

            if (string.IsNullOrWhiteSpace(logicName))
            {
                logicName = entityInfo.DatabaseName;
            }

            return(logicName);
        }
Пример #8
0
        public (string, List <DatabaseParameter>) BuildDelete <T>(T criteria)
        {
            if (criteria == null)
            {
                throw new DalException(ErrorCode.InvalidSqlParameters, "Invalid sql parameters, parameter is null");
            }

            var info = EntityMetaDataMapper.GetInstance().Get <T>();
            var sb   = new StringBuilder($"DELETE FROM {info.TableName} ");

            (string sql, List <DatabaseParameter> pkParameters) = GeneratePrimaryKeyClause(criteria);
            sb.Append(sql);

            return(sb.ToString(), pkParameters);
        }
Пример #9
0
        private string GetPrimarySql <T>()
        {
            var info = EntityMetaDataMapper.GetInstance().Get <T>();

            var sb = new StringBuilder("SELECT ", 200);

            foreach (var column in info.Columns)
            {
                sb.Append($"`{column.Attribute.Name}`, ");
            }

            // 删除最后一个,
            sb.Remove(sb.Length - 2, 2);
            sb.Append($" FROM `{info.TableName}` ");

            return(sb.ToString());
        }
Пример #10
0
        public (string, List <DatabaseParameter>) BuildUpdate <T>(T criteria)
        {
            if (criteria == null)
            {
                throw new DalException(ErrorCode.InvalidSqlParameters, "Invalid sql parameters, parameter is null");
            }

            var info = EntityMetaDataMapper.GetInstance().Get <T>();

            var sb         = new StringBuilder($"UPDATE {info.TableName} SET ");
            var parameters = new List <DatabaseParameter>();

            foreach (var column in info.Columns)
            {
                // 主键不参与更新
                if (column.Attribute.PrimaryKey == true)
                {
                    continue;
                }

                var value = column.ColumnProperty.GetValue(criteria);
                if (value == null)
                {
                    continue;
                }

                sb.Append($"`{column.Attribute.Name}` = ?, ");
                parameters.Add(new DatabaseParameter()
                {
                    Name  = column.Attribute.Name,
                    Value = value
                });
            }
            ;

            // 删除最后一个,
            sb.Remove(sb.Length - 2, 2);
            (string sql, List <DatabaseParameter> pkParameters) = GeneratePrimaryKeyClause(criteria);
            sb.Append(sql);
            sb.Append(";");
            parameters.AddRange(pkParameters);

            return(sb.ToString(), parameters);
        }
Пример #11
0
        /// <summary>
        /// 条件查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="criteria"></param>
        /// <returns></returns>
        public async Task <List <T> > Query <T>(T criteria, int?recordCount = null) where T : class, new()
        {
            var mapper = EntityMetaDataMapper.GetInstance();

            // 获取组装好的sql和参数
            (string sql, List <DatabaseParameter> parameters) =
                SqlBuilderFactory.GetInstance <T>().BuildSelect(criteria, recordCount);

            var logicName = databaseName;

            if (string.IsNullOrWhiteSpace(logicName))
            {
                logicName = mapper.Get <T>().DatabaseName;
            }

            var client  = DalClientFactory.GetClient(logicName);
            var dataSet = await client.Query(sql, parameters);

            return(mapper.Convert <T>(dataSet));
        }
Пример #12
0
        public async Task <int> Insert <T>(T entity) where T : class, new()
        {
            // 获取组装好的sql和参数
            (string sql, List <DatabaseParameter> parameters) =
                SqlBuilderFactory.GetInstance <T>().BuildInsert(entity);

            var client = DalClientFactory.GetClient(GetLogicDatabaseName <T>());
            // 将主键返回给实体
            var hints = DalHints.Create();

            // 如果当前实例含有自增主键,且自增主键的实体不为空,那么需要数据库返回自增住居
            var identity = EntityMetaDataMapper.GetInstance().Get <T>().Columns.Find(p => p.Attribute.Identity);

            if (identity != null && identity.Attribute.Identity && identity.ColumnProperty.GetValue(entity) == null)
            {
                hints.Add(DalHint.SetIdentity);
            }

            var result = await client.Execute(sql, parameters, hints);

            // 如果数据库返回了主键,那么将主键设置回实体
            // 暂时先这么写
            if (result.Identity > 0)
            {
                if (identity.ColumnProperty.PropertyType == typeof(int?))
                {
                    int.TryParse(result.Identity.ToString(), out var value);
                    identity.ColumnProperty.SetValue(entity, value);
                }
                else
                {
                    long.TryParse(result.Identity.ToString(), out var value);
                    identity.ColumnProperty.SetValue(entity, value);
                }
            }

            return(result.ReturnCode);
        }
Пример #13
0
        public (string, List <DatabaseParameter>) BuildInsert <T>(T criteria)
        {
            if (criteria == null)
            {
                throw new DalException(ErrorCode.InvalidSqlParameters, "Invalid sql parameters, parameter is null");
            }

            var info = EntityMetaDataMapper.GetInstance().Get <T>();

            var sb            = new StringBuilder($"INSERT INTO {info.TableName} (");
            var questionMarks = new List <string>();
            var parameters    = new List <DatabaseParameter>();

            foreach (var column in info.Columns)
            {
                var value = column.ColumnProperty.GetValue(criteria);
                if (value == null)
                {
                    continue;
                }

                sb.Append($"`{column.Attribute.Name}`, ");
                questionMarks.Add("?");
                parameters.Add(new DatabaseParameter()
                {
                    Name  = column.Attribute.Name,
                    Value = value
                });
            }
            ;

            // 删除最后一个,
            sb.Remove(sb.Length - 2, 2);
            sb.Append($") VALUES ({string.Join(",", questionMarks)});");

            return(sb.ToString(), parameters);
        }