Пример #1
0
        public static string SelectSQL(Type entityType, string where = "")
        {
            string selectSQL;

            if (!selectSQLCache.TryGetValue(entityType, out selectSQL))               //如果从缓存里面没有找到
            {
                var columns = entityType.GetProperties().Where(item =>
                {
                    return(!EntityParser.IsIgnore(item));
                }).Select(item => string.Format(" [{0}]", EntityParser.GetColumnName(item)));

                if (!columns.Any())
                {
                    throw new Exception(string.Format("类型{0}没有任何可以SELECT的列", entityType.FullName));
                }

                selectSQL = string.Format("SELECT{0} FROM {1}",
                                          string.Join(",", columns),
                                          EntityParser.GetTableName(entityType)
                                          );
                selectSQLCache.Add(entityType, selectSQL);
            }

            if (!string.IsNullOrEmpty(where))
            {
                where = " WHERE " + where;
            }

            return(selectSQL + where);
        }
Пример #2
0
        /// <summary>
        /// 根据主键删除一个实体
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="key">主键的值</param>
        public static void DeleteByKey <TEntity>(object key) where TEntity : SQLEntity
        {
            var keyInfo = EntityParser.GetKey(typeof(TEntity));

            var keyName = keyInfo.KeyName;

            var sql = SqlBuilder.DeleteSQL(EntityParser.GetTableName(typeof(TEntity)), string.Format("{0} = @{0}", keyName));

            SQLServerHelper.ExecuteNonQuery(sql, new SqlParameter("@" + keyName, key));
        }
Пример #3
0
        public static string InsertSQL(Type entityType)
        {
            string sql;

            if (!insertSQLCache.TryGetValue(entityType, out sql))
            {
                StringBuilder insert = new StringBuilder();

                var key = EntityParser.GetKey(entityType);
                if (!key.KeyConfig.UsePropertyForInsert)
                {
                    insert.AppendLine(key.KeyConfig.KeyBeforeInsertSQL);
                }


                string tableName = EntityParser.GetTableName(entityType);
                insert.AppendFormat("INSERT INTO [{0}]", tableName);

                var properties = entityType.GetProperties().Where(item => !EntityParser.IsIgnore(item)).Select(item =>
                {
                    string columnSQL = EntityParser.GetColumnName(item);
                    string valueSQL  = "";
                    var config       = EntityParser.GetColumnConfig(item);
                    if (config.UsePropertyForInsert)
                    {
                        valueSQL = " @" + item.Name;
                    }
                    else
                    {
                        valueSQL = config.InsertSQL;
                    }

                    return(new KeyValuePair <string, string>(columnSQL, valueSQL));
                }).Where(item => !string.IsNullOrEmpty(item.Value));

                insert.AppendFormat("({0})", string.Join(",", properties.Select(item => item.Key))).AppendLine();
                insert.AppendFormat("VALUES({0})", string.Join(",", properties.Select(item => item.Value))).AppendLine();

                if (!key.KeyConfig.UsePropertyForInsert)
                {
                    insert.Append("SELECT ").AppendLine(key.KeyConfig.KeyAfterInsertSQL);
                }

                insertSQLCache.Add(entityType, insert.ToString());
                return(insert.ToString());
            }
            return(sql);
        }
Пример #4
0
        /// <summary>
        /// 将实体实例的属性的值更新到数据库中,必须指定主键
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entity"></param>
        /// <param name="updateToEntity"></param>
        /// <returns></returns>
        public static TEntity Update <TEntity>(TEntity entity, bool updateToEntity = true) where TEntity : SQLEntity
        {
            if (entity.EntityState == EntityState.NotInitialized)
            {
                throw new Exception("要更新的实体尚未初始化");
            }
            else if (entity.EntityState == EntityState.NotChanged)
            {
                return(entity);
            }
            else
            {
                var entityType = typeof(TEntity);

                var key = EntityParser.GetKey(entityType);                  //找到主键属性
                if (key == null)
                {
                    throw new Exception("在实体类中没有找主键属性");
                }

                List <SqlParameter> parameters = new List <SqlParameter>();

                var           tableName = EntityParser.GetTableName(entityType);
                StringBuilder update    = new StringBuilder();
                update.AppendFormat("UPDATE [{0}] SET ", tableName);
                var flags = false;
                foreach (var propertyName in entity)                  //遍历更改的属性
                {
                    if (propertyName == key.PropertyName)
                    {
                        continue;
                    }
                    var propertyInfo = entityType.GetProperty(propertyName);
                    if (propertyInfo == null || EntityParser.IsIgnore(propertyInfo))                      //如果找不到属性或不映射到数据库
                    {
                        continue;
                    }

                    var sqlPair = SqlBuilder.ColumnSqlForUpdate(entity, propertyInfo, parameters);                      //获取更新列值的sql语句
                    if (string.IsNullOrEmpty(sqlPair))
                    {
                        continue;
                    }
                    else
                    {
                        string columnName = EntityParser.GetColumnName(propertyInfo);
                        update.AppendFormat("{0} = {1}, ", columnName, sqlPair);
                        flags = true;
                    }
                }

                if (flags)
                {
                    update.Remove(update.Length - 2, 2).AppendFormat(" ");
                }
                else
                {
                    return(entity);
                }

                update.AppendFormat(" WHERE {0} = @{0}", key.KeyName);

                var keyValue = key.Key.GetValue(entity, null);                  //获取主键的值

                parameters.Add(new SqlParameter("@" + key.PropertyName, keyValue));

                SQLServerHelper.ExecuteNonQuery(update.ToString(), parameters.ToArray()); //更新到数据库
                entity.EntityState = EntityState.NotChanged;                              //未更改
                if (updateToEntity)
                {
                    //SingleByKey(keyValue, entity);  //从数据库刷新属性
                    RefreshEntity(entity);
                }
            }
            return(entity);
        }
Пример #5
0
        /// <summary>
        /// 根据指定的条件删除多个实体
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="where">条件</param>
        /// <param name="pms">参数</param>
        public static void Delete <TEntity>(string where, params SqlParameter[] pms) where TEntity : SQLEntity
        {
            var sql = SqlBuilder.DeleteSQL(EntityParser.GetTableName(typeof(TEntity)), where);

            SQLServerHelper.ExecuteNonQuery(sql, pms);
        }