Пример #1
0
        public T ReflectionToEntity(SqlDataReader sdr)
        {
            var entity = new T();

            foreach (var property in _master.Properties)
            {
                property.PropertyInfo.SetValue(entity, sdr[property.Name]);
            }

            foreach (var include in _include)
            {
                var prop = _master.Properties.Single(p => p.Name == include);
                if (prop == null)
                {
                    continue;
                }

                var subType       = prop.PropertyInfo.PropertyType;
                var subEntityInfo = MyEntityContainer.Get(subType);
                var subEntity     = Activator.CreateInstance(subType);

                foreach (var subProperty in subEntityInfo.Properties)
                {
                    if (subProperty.IsMap)
                    {
                        subProperty.PropertyInfo.SetValue(subEntity, sdr[$"{include}__{subProperty.Name}"]);
                    }
                }

                prop.PropertyInfo.SetValue(entity, subEntity);
            }

            return(entity);
        }
Пример #2
0
        /// <summary>
        /// 创建一个实体,新的记录Id将绑定到entity的Id属性
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">要创建的实体</param>
        /// <returns>新生成记录的ID,若失败返回0</returns>
        public int Insert <T>(T entity) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerSqlBuilder();
            var sql        = sqlBuilder.Insert(entityInfo);

            var parameterList = entityInfo
                                .Properties
                                .Where(p => !p.InsertIgnore)
                                .Select(p => new SqlParameter($"{_prefix}{p.Name}", ResolveParameterValue(p.PropertyInfo.GetValue(entity))));

            var command = new SqlCommand(sql);

            command.Parameters.AddRange(parameterList.ToArray());

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                var result = command.ExecuteScalar().ToString();
                entity.Id = Convert.ToInt32(string.IsNullOrWhiteSpace(result) ? "0" : result);
                return(entity.Id);
            }
        }
Пример #3
0
        public async Task <int> UpdateIgnoreAsync <T>(T entity, IEnumerable <string> ignore, bool ignoreAttribute = true) where T : IEntity
        {
            var entityInfo        = MyEntityContainer.Get(typeof(T));
            var includeProperties = entityInfo.Properties.Where(p => !ignore.Contains(p.Name) && p.Name != "Id").ToList();

            if (!ignoreAttribute)
            {
                includeProperties = includeProperties.Where(p => !p.UpdateIgnore).ToList();
            }

            if (!includeProperties.Any())
            {
                return(0);
            }

            var sql =
                $"UPDATE [{entityInfo.TableName}] SET {string.Join(",", includeProperties.Select(p => $"{p.FieldName}=@{p.Name}"))} WHERE Id=@Id";
            var parameters = new List <SqlParameter> {
                new SqlParameter("@Id", entity.Id)
            };

            foreach (var property in includeProperties)
            {
                parameters.Add(new SqlParameter($"@{property.Name}", ResolveParameterValue(property.PropertyInfo.GetValue(entity))));
            }

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                var command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(parameters.ToArray());
                return(await command.ExecuteNonQueryAsync());
            }
        }
Пример #4
0
        /// <summary>
        /// 根据ID批量删除记录,如果支持软删除并且非强制删除,则更新IsDel字段为true,否则,删除记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="idList">要删除的ID列表</param>
        /// <param name="isForce">是否强制删除,默认为false</param>
        /// <returns>受影响的记录数</returns>
        public int Delete <T>(IEnumerable <int> idList, bool isForce = false) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            if (isForce || !entityInfo.IsSoftDelete)
            {
                var sql =
                    $"EXEC('DELETE [{entityInfo.TableName}] WHERE [{entityInfo.KeyColumn}] in ('+{_prefix}Ids+')')";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    command.Parameters.AddWithValue($"{_prefix}Ids", string.Join(",", idList));
                    return(command.ExecuteNonQuery());
                }
            }
            else
            {
                var sql = $"EXEC('UPDATE [{entityInfo.TableName}] SET IsDel=1 WHERE [{entityInfo.KeyColumn}] in ('+{_prefix}Ids+')')";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    command.Parameters.AddWithValue($"{_prefix}Id", idList);
                    return(command.ExecuteNonQuery());
                }
            }
        }
Пример #5
0
        protected override string ResolveStackToField(Stack <string> parameterStack)
        {
            switch (parameterStack.Count)
            {
            case 2:
            {
                // 调用了导航属性
                var propertyName      = parameterStack.Pop();
                var propertyFieldName = parameterStack.Pop();

                MyEntity propertyEntity = Result.NavPropertyList.SingleOrDefault(p => p.Name == propertyName);
                if (propertyEntity == null)
                {
                    var prop = Entity.Properties.Single(p => p.Name == propertyName);
                    propertyEntity = MyEntityContainer.Get(prop.PropertyInfo.PropertyType);
                    Result.NavPropertyList.Add(propertyEntity);
                }

                var propertyProperty = propertyEntity.Properties.Single(p => p.Name == propertyFieldName);
                return($"[{propertyName}].[{propertyProperty.FieldName}]");
            }

            case 1:
            {
                var propertyName = parameterStack.Pop();
                var propInfo     = Entity.Properties.Single(p => p.Name == propertyName);
                return($"[{Entity.TableName}].[{propInfo.FieldName}]");
            }

            default:
                throw new ArgumentException("尚未支持大于2层属性调用。如 student.Clazz.School.Id>10,请使用类似 student.Clazz.SchoolId > 0 替代");
            }
        }
Пример #6
0
        public async Task <int> UpdateIfNotExitsAsync <T>(T entity, Expression <Func <T, bool> > where)
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var resolver   = new EditConditionResolver <T>(entityInfo);
            var result     = resolver.Resolve(where.Body);
            var condition  = result.Condition;
            var parameters = result.Parameters;

            parameters.Add(entity);

            condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.Update(entityInfo, "");

            sql += $" AND NOT EXISTS (SELECT 1 FROM [{entityInfo.TableName}] WHERE {condition})";

            var command = new SqlCommand(sql);

            command.Parameters.AddRange(parameters.Parameters);

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                return(await command.ExecuteNonQueryAsync());
            }
        }
Пример #7
0
        public async Task <int> DeleteAsync <T>(Expression <Func <T, bool> > expression, bool isForce) where T : IEntity
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var resolver   = new EditConditionResolver <T>(entityInfo);
            var result     = resolver.Resolve(expression.Body);
            var condition  = result.Condition;
            var parameters = result.Parameters;

            condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;
            string sql;

            if (isForce || !entityInfo.IsSoftDelete)
            {
                sql =
                    $"DELETE [{entityInfo.TableName}] WHERE {condition}";
            }
            else
            {
                sql =
                    $"UPDATE [{entityInfo.TableName}] SET IsDel=1 WHERE {condition}";
            }

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                var command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(parameters.Parameters);
                return(await command.ExecuteNonQueryAsync());
            }
        }
Пример #8
0
        public async Task <int> DeleteAsync <T>(int id, bool isForce = false) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            if (isForce || !entityInfo.IsSoftDelete)
            {
                var sql = $"DELETE [{entityInfo.TableName}] WHERE [{entityInfo.KeyColumn}]={_prefix}Id";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    command.Parameters.AddWithValue($"{_prefix}Id", id);
                    return(await command.ExecuteNonQueryAsync());
                }
            }
            else
            {
                var sql = $"UPDATE [{entityInfo.TableName}] SET IsDel=1 WHERE [{entityInfo.KeyColumn}]={_prefix}Id";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    command.Parameters.AddWithValue($"{_prefix}Id", id);
                    return(await command.ExecuteNonQueryAsync());
                }
            }
        }
Пример #9
0
        private string ResolveStackToField(Stack <string> parameterStack)
        {
            switch (parameterStack.Count)
            {
            case 2:
            {
                // 调用了导航属性
                var propertyName      = parameterStack.Pop();
                var propertyFieldName = parameterStack.Pop();

                _joinProperties.Add(propertyName);

                if (!_joinProperties.Contains(propertyName))
                {
                    _joinProperties.Add(propertyName);
                }

                var prop             = _master.Properties.Single(p => p.Name == propertyName);
                var propertyEntity   = MyEntityContainer.Get(prop.PropertyInfo.PropertyType);
                var propertyProperty = propertyEntity.Properties.Single(p => p.Name == propertyFieldName);

                return($"[{propertyName}].[{propertyProperty.FieldName}]");
            }

            case 1:
            {
                var propertyName = parameterStack.Pop();
                var propInfo     = _master.Properties.Single(p => p.Name == propertyName);
                return($"[{_master.TableName}].[{propInfo.FieldName}]");
            }

            default:
                throw new ArgumentException("尚未支持大于2层属性调用。如 student.Clazz.School.Id>10,请使用类似 student.Clazz.SchoolId > 0 替代");
            }
        }
Пример #10
0
        /// <summary>
        /// 如果不满足条件则创建一个实体,
        /// 如限制用户名不能重复 InsertIfNotExist(user, u => u.Name == user.Name)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">要创建的实体</param>
        /// <param name="where">条件</param>
        /// <returns>新生成记录的ID,若失败返回0</returns>
        public int InsertIfNotExists <T>(T entity, Expression <Func <T, bool> > where) where T : class, IEntity, new()
        {
            if (where == null)
            {
                return(Insert(entity));
            }

            var entityInfo = MyEntityContainer.Get(typeof(T));
            var resolver   = new EditConditionResolver <T>(entityInfo);
            var result     = resolver.Resolve(@where.Body);
            var condition  = result.Condition;
            var parameters = result.Parameters;

            parameters.Add(entity);

            condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.InsertIfNotExists(entityInfo, condition);
            var command    = new SqlCommand(sql);

            command.Parameters.AddRange(parameters.Parameters);

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                var obj = command.ExecuteScalar();
                if (obj != DBNull.Value)
                {
                    entity.Id = Convert.ToInt32(obj);
                }
                return(entity.Id);
            }
        }
Пример #11
0
        public async Task <int> InsertAsync <T>(T entity) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.Insert(entityInfo);

            var parameters = new MyDbParameters();

            parameters.Add(entity);

            var command = new SqlCommand(sql);

            command.Parameters.AddRange(parameters.Parameters);

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                var obj = await command.ExecuteScalarAsync();

                if (obj != DBNull.Value)
                {
                    entity.Id = Convert.ToInt32(obj);
                }
                return(entity.Id);
            }
        }
Пример #12
0
        public T ConvertToObject(SqlDataReader sdr, List <KeyValuePair <string, string> > keyValuePairs)
        {
            var entity = new T();

            foreach (var property in Master.Properties.Where(p => p.IsMap))
            {
                property.PropertyInfo.SetValue(entity, sdr[property.Name]);
            }

            foreach (var include in Includes)
            {
                var prop = Master.Properties.SingleOrDefault(p => p.Name == include);
                if (prop != null)
                {
                    var subType       = prop.PropertyInfo.PropertyType;
                    var subEntityInfo = MyEntityContainer.Get(subType);
                    var subEntity     = Activator.CreateInstance(subType);

                    foreach (var subProperty in subEntityInfo.Properties.Where(p => p.IsMap))
                    {
                        subProperty.PropertyInfo.SetValue(subEntity, sdr[$"{include}_{subProperty.Name}"]);
                    }

                    prop.PropertyInfo.SetValue(entity, subEntity);
                }
            }

            return(entity);
        }
Пример #13
0
        private void ResolveStackToField(Stack <string> parameterStack)
        {
            if (parameterStack.Count == 2)
            {
                // 调用了导航属性
                var propertyName      = parameterStack.Pop();
                var propertyFieldName = parameterStack.Pop();

                _joinProperties.Add(propertyName);

                var prop             = _master.Properties.Single(p => p.Name == propertyName);
                var propertyEntity   = MyEntityContainer.Get(prop.PropertyInfo.PropertyType);
                var propertyProperty = propertyEntity.Properties.Single(p => p.Name == propertyFieldName);

                _stringStack.Push($"[{propertyName}].[{propertyProperty.FieldName}]");
            }
            else if (parameterStack.Count == 1)
            {
                var propertyName = parameterStack.Pop();
                var propInfo     = _master.Properties.Single(p => p.Name == propertyName);
                _stringStack.Push($"[{_master.TableName}].[{propInfo.FieldName}]");
            }
            else
            {
                throw new ArgumentException("尚未支持大于2层属性调用。如 student.Clazz.School.Id>10,请使用类似 student.Clazz.SchoolId > 0 替代");
            }
        }
Пример #14
0
 public MyUpdateable()
 {
     _entity              = MyEntityContainer.Get(typeof(T));
     _entityList          = new List <T>();
     _ignorePropertyList  = new List <string>();
     _includePropertyList = new List <string>();
     _includeOrIgnore     = 0;
     _ignoreAttribute     = true;
 }
Пример #15
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">要修改的实体</param>
        /// <param name="expression">要修改的属性,注意不支持导航属性及其子属性</param>
        /// <param name="ignoreAttribute">是否忽略实体的UpdateIgnore描述。默认为true,既includes中包含的所有属性都会被修改</param>
        /// <returns>受影响的记录数</returns>
        public int UpdateIgnore <T>(T entity, Expression <Func <T, object> > expression, bool ignoreAttribute = true) where T : IEntity
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));
            var visitor    = new ObjectExpressionVisitor(entityInfo);

            visitor.Visit(expression);
            var include = visitor.GetPropertyList().Select(kv => kv.Key);

            return(UpdateIgnore(entity, include, ignoreAttribute));
        }
Пример #16
0
        public async Task <int> UpdateIgnoreAsync <T>(T entity, Expression <Func <T, object> > expression, bool ignoreAttribute = true) where T : IEntity
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));
            var visitor    = new ObjectMemberVisitor();

            visitor.Visit(expression);
            var include = visitor.GetPropertyList();

            return(await UpdateIgnoreAsync(entity, include, ignoreAttribute));
        }
Пример #17
0
        /// 把要用到的导航属性的MyEntity缓存到一个List里,不需要每次都要到字典中获取
        private MyEntity GetIncludePropertyEntityInfo(Type type)
        {
            var entity = _entityCache.FirstOrDefault(e => e.FullName == type.FullName);

            if (entity != null)
            {
                return(entity);
            }

            entity = MyEntityContainer.Get(type);
            _entityCache.Add(entity);
            return(entity);
        }
Пример #18
0
        public SqlDataReaderConverter(IEnumerable <string> props = null)
        {
            _master  = MyEntityContainer.Get(typeof(T));
            _include = props?.ToList() ?? new List <string>();
            _key     = typeof(T).FullName;

            if (_include.Count <= 0)
            {
                return;
            }

            _include.Sort();
            _key += string.Join("-", _include.Distinct());
        }
Пример #19
0
        /// <summary>
        /// 通过查询条件修改指定列
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="kvs">属性和值的键值对。用法 DbKvs.New().Add("属性名", 值)</param>
        /// <param name="expression">查询条件,注意:不支持导航属性,如 "student => student.School.Id > 0" 将无法解析</param>
        /// <returns>受影响的记录数</returns>
        public int Update <T>(DbKvs kvs, Expression <Func <T, bool> > expression = null)
        {
            var entityInfo        = MyEntityContainer.Get(typeof(T));
            var setProperties     = kvs.Where(kv => kv.Key != "Id").Select(kv => kv.Key);
            var includeProperties = entityInfo.Properties.Where(p => setProperties.Contains(p.Name)).ToList();

            if (includeProperties.Count == 0)
            {
                return(0);
            }

            string sql;
            List <SqlParameter> parameters;

            if (expression == null)
            {
                sql =
                    $"UPDATE [{entityInfo.TableName}] SET {string.Join(",", includeProperties.Select(p => $"{p.FieldName}=@{p.Name}"))} WHERE Id=@Id";
                parameters = kvs.ToSqlParameters();
            }
            else
            {
                //var whereExpressionVisitor = new WhereExpressionVisitor<T>();
                //whereExpressionVisitor.Visit(expression);
                //var where = whereExpressionVisitor.GetCondition();
                //var whereParameters = whereExpressionVisitor.GetParameters().ToSqlParameters();

                var resolver = new ConditionResolver(entityInfo);
                resolver.Resolve(expression.Body);
                var where = resolver.GetCondition();
                var whereParameters = resolver.GetParameters().ToSqlParameters();

                parameters = kvs.ToSqlParameters();
                parameters.AddRange(whereParameters);

                where = string.IsNullOrWhiteSpace(where) ? "1=1" : where;

                sql =
                    $"UPDATE [{entityInfo.TableName}] SET {string.Join(",", includeProperties.Select(p => $"{p.FieldName}=@{p.Name}"))} WHERE {where}";
            }

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                var command = new SqlCommand(sql, conn);
                command.Parameters.AddRange(parameters.ToArray());
                return(command.ExecuteNonQuery());
            }
        }
Пример #20
0
        public SqlDataReaderConverter(string[] props = null)
        {
            Master = MyEntityContainer.Get(typeof(T));

            if (props == null || props.Length == 0)
            {
                Includes = new List <string>();
                Key      = typeof(T).FullName;
            }
            else
            {
                Includes = props.ToList();
                Key      = typeof(T).FullName + "-" + string.Join("-", props.OrderBy(p => p).Distinct());
            }
        }
Пример #21
0
        public async Task <int> InsertAsync <T>(List <T> entityList) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.Insert(entityInfo);

            var count = 0;

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var trans = conn.BeginTransaction())
                {
                    try
                    {
                        foreach (var entity in entityList)
                        {
                            using (var command = new SqlCommand(sql, conn, trans))
                            {
                                var parameters = new MyDbParameters();
                                parameters.Add(entity);
                                command.Parameters.AddRange(parameters.Parameters);
                                var obj = await command.ExecuteScalarAsync();

                                if (obj != DBNull.Value)
                                {
                                    entity.Id = Convert.ToInt32(obj);
                                    count++;
                                }
                            }
                        }
                        trans.Commit();
                    }
                    catch
                    {
                        trans.Rollback();
                        count = 0;
                    }
                }
            }

            return(count);
        }
        public void ResolveMemberAccessExpression(MemberExpression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            var rootType = expression.RootExpressionType(out var parameterStack);

            if (rootType == ExpressionType.Parameter)
            {
                if (parameterStack.Count == 2)
                {
                    // 调用了导航属性
                    var propertyName      = parameterStack.Pop();
                    var propertyFieldName = parameterStack.Pop();

                    JoinPropertyList.Add(propertyName);

                    var prop             = _master.Properties.Single(p => p.Name == propertyName);
                    var propertyEntity   = MyEntityContainer.Get(prop.PropertyInfo.PropertyType);
                    var propertyProperty = propertyEntity.Properties.Single(p => p.Name == propertyFieldName);

                    _stringStack.Push($"[{propertyName}].[{propertyProperty.FieldName}]");
                }
                else if (parameterStack.Count == 1)
                {
                    var propertyName = parameterStack.Pop();
                    var propInfo     = _master.Properties.Single(p => p.Name == propertyName);
                    _stringStack.Push($"[{_master.TableName}].[{propInfo.FieldName}]");
                }
                else
                {
                    throw new ArgumentException("尚未支持大于2层属性调用。如 student.Clazz.School.Id>10,请使用类似 student.Clazz.SchoolId > 0 替代");
                }
            }
            else
            {
                var obj           = ResolveValue(expression.GetValue());
                var parameterName = $"{_prefix}__p_{_parameterIndex++}";
                _parameters.Add(new KeyValuePair <string, object>(parameterName, obj));
                _stringStack.Push($" {parameterName} ");
            }
        }
Пример #23
0
        /// <summary>
        /// 如果不满足条件则创建一个实体,
        /// 如限制用户名不能重复 InsertIfNotExist(user, u => u.Name == user.Name)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">要创建的实体</param>
        /// <param name="where">条件</param>
        /// <returns>新生成记录的ID,若失败返回0</returns>
        public int InsertIfNotExists <T>(T entity, Expression <Func <T, bool> > where) where T : class, IEntity, new()
        {
            if (where == null)
            {
                return(Insert(entity));
            }
            else
            {
                var entityInfo = MyEntityContainer.Get(typeof(T));
                //var whereExpressionVisitor = new WhereExpressionVisitor<T>(entityInfo);
                //whereExpressionVisitor.Visit(where);
                //var condition = whereExpressionVisitor.GetCondition();
                //var parameters = whereExpressionVisitor.GetParameters().ToSqlParameters();

                var resolver = new ConditionResolver(entityInfo);
                resolver.Resolve(where.Body);
                var condition  = resolver.GetCondition();
                var parameters = resolver.GetParameters().ToSqlParameters();

                condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;

                var sqlBuilder = new SqlServerSqlBuilder();
                var sql        = sqlBuilder.InsertIfNotExists(entityInfo, condition);

                parameters.AddRange(
                    entityInfo
                    .Properties
                    .Where(p => !p.InsertIgnore)
                    .Select(p => new SqlParameter($"{_prefix}{p.Name}",
                                                  ResolveParameterValue(p.PropertyInfo.GetValue(entity)))));
                var command = new SqlCommand(sql);
                command.Parameters.AddRange(parameters.ToArray());

                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    command.Connection = conn;
                    var result = command.ExecuteScalar().ToString();
                    entity.Id = Convert.ToInt32(string.IsNullOrWhiteSpace(result) ? "0" : result);
                    return(entity.Id);
                }
            }
        }
Пример #24
0
        /// <summary>
        /// 批量创建实体,注意此方法效率不高
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entityList">实体列表</param>
        /// <returns>受影响的记录数</returns>
        public int Insert <T>(List <T> entityList) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerSqlBuilder();
            var sql        = sqlBuilder.Insert(entityInfo);

            var count = 0;

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var trans = conn.BeginTransaction())
                {
                    try
                    {
                        foreach (var entity in entityList)
                        {
                            using (var command = new SqlCommand(sql, conn, trans))
                            {
                                command.Parameters.AddRange(entityInfo
                                                            .Properties
                                                            .Where(p => !p.InsertIgnore)
                                                            .Select(p => new SqlParameter($"{_prefix}{p.Name}",
                                                                                          ResolveParameterValue(p.PropertyInfo.GetValue(entity))))
                                                            .ToArray());
                                var result = command.ExecuteScalar().ToString();
                                entity.Id = Convert.ToInt32(string.IsNullOrWhiteSpace(result) ? "0" : result);
                                count++;
                            }
                        }
                        trans.Commit();
                    }
                    catch
                    {
                        trans.Rollback();
                        count = 0;
                    }
                }
            }

            return(count);
        }
Пример #25
0
        /// <summary>
        /// 更新多个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entityList">要更新的实体列表</param>
        /// <returns>受影响的记录数</returns>
        public int Update <T>(List <T> entityList) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerSqlBuilder();
            var sql        = sqlBuilder.Update(entityInfo, "");

            var count = 0;

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var trans = conn.BeginTransaction())
                {
                    try
                    {
                        foreach (var entity in entityList)
                        {
                            using (var command = new SqlCommand(sql, conn, trans))
                            {
                                command.Parameters.AddRange(entityInfo
                                                            .Properties
                                                            .Where(p => !p.UpdateIgnore || p.IsKey)
                                                            .Select(p => new SqlParameter($"{_prefix}{p.Name}",
                                                                                          ResolveParameterValue(p.PropertyInfo.GetValue(entity))))
                                                            .ToArray());
                                count += command.ExecuteNonQuery();
                            }
                        }
                        trans.Commit();
                    }
                    catch (Exception)
                    {
                        trans.Rollback();
                        count = 0;
                    }
                }
            }

            return(count);
        }
        public string GetFieldFullName(Stack <string> stack)
        {
            if (stack.Count == 1)
            {
                var fieldName = stack.Pop();
                var property  = _master.Properties.Single(p => p.Name == fieldName);
                return($"[{_master.TableName}].[{property.FieldName}]");
            }
            else if (stack.Count == 2)
            {
                var propertyName = stack.Pop();
                var fieldName    = stack.Pop();

                var property       = _master.Properties.Single(p => p.Name == propertyName);
                var propertyEntity = MyEntityContainer.Get(property.PropertyInfo.PropertyType);
                var field          = propertyEntity.Properties.Single(p => p.Name == fieldName);

                return($"[{propertyName}].[{field.FieldName}]");
            }
            return(string.Empty);
        }
Пример #27
0
        public async Task <int> GetCountAsync <T>(Expression <Func <T, bool> > expression = null) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            if (expression == null)
            {
                var sql = $"SELECT COUNT(0) FROM [{entityInfo.TableName}]";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    return((int)command.ExecuteScalar());
                }
            }
            else
            {
                var resolver   = new EditConditionResolver <T>(entityInfo);
                var result     = resolver.Resolve(expression.Body);
                var condition  = result.Condition;
                var parameters = result.Parameters;

                condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;

                var sql = $"SELECT COUNT(0) FROM [{entityInfo.TableName}] WHERE [{condition}]";
                using (var conn = new SqlConnection(_connectionString))
                {
                    conn.Open();
                    var command = new SqlCommand(sql, conn);
                    command.Parameters.AddRange(parameters.Parameters);
                    var obj = await command.ExecuteScalarAsync();

                    if (obj == null)
                    {
                        return(0);
                    }

                    return((int)obj);
                }
            }
        }
Пример #28
0
        /// <summary>
        /// 如果不存在,则更新
        /// 如:UpdateIfNotExists(user, u=>u.Name == user.Name && u.Id != user.Id)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="where"></param>
        /// <returns>受影响的记录数</returns>
        public int UpdateIfNotExits <T>(T entity, Expression <Func <T, bool> > where)
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            //var whereExpressionVisitor = new WhereExpressionVisitor<T>(entityInfo);
            //whereExpressionVisitor.Visit(where);
            //var condition = whereExpressionVisitor.GetCondition();
            //var parameters = whereExpressionVisitor.GetParameters().ToSqlParameters();

            var resolver = new ConditionResolver(entityInfo);

            resolver.Resolve(where.Body);
            var condition  = resolver.GetCondition();
            var parameters = resolver.GetParameters().ToSqlParameters();

            condition = string.IsNullOrWhiteSpace(condition) ? "1=1" : condition;

            var sqlBuilder = new SqlServerSqlBuilder();
            var sql        = sqlBuilder.Update(entityInfo, "");

            sql += $" AND NOT EXISTS (SELECT 1 FROM [{entityInfo.TableName}] WHERE {condition})";

            parameters.AddRange(
                entityInfo
                .Properties
                .Where(p => !p.UpdateIgnore || p.IsKey)
                .Select(p => new SqlParameter($"{_prefix}{p.Name}",
                                              ResolveParameterValue(p.PropertyInfo.GetValue(entity)))));

            var command = new SqlCommand(sql);

            command.Parameters.AddRange(parameters.ToArray());

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                return(command.ExecuteNonQuery());
            }
        }
Пример #29
0
        public async Task <int> UpdateAsync <T>(T entity) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.Update(entityInfo, "");

            var parameters = new MyDbParameters();

            parameters.Add(entity);

            var command = new SqlCommand(sql);

            command.Parameters.AddRange(parameters.Parameters);

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                command.Connection = conn;
                return(await command.ExecuteNonQueryAsync());
            }
        }
Пример #30
0
        /// <summary>
        /// 更新多个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entityList">要更新的实体列表</param>
        /// <returns>受影响的记录数</returns>
        public int Update <T>(List <T> entityList) where T : class, IEntity, new()
        {
            var entityInfo = MyEntityContainer.Get(typeof(T));

            var sqlBuilder = new SqlServerBuilder();
            var sql        = sqlBuilder.Update(entityInfo, "");

            var count = 0;

            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                using (var trans = conn.BeginTransaction())
                {
                    try
                    {
                        foreach (var entity in entityList)
                        {
                            using (var command = new SqlCommand(sql, conn, trans))
                            {
                                var param = new MyDbParameters();
                                param.Add(entity);
                                command.Parameters.AddRange(param.Parameters);
                                count += command.ExecuteNonQuery();
                            }
                        }
                        trans.Commit();
                    }
                    catch (Exception)
                    {
                        trans.Rollback();
                        count = 0;
                    }
                }
            }

            return(count);
        }