コード例 #1
0
        public T Get <T>(object id, string tableName = null, int?commandTimeout = null) where T : class
        {
            IClassMapper       classMapper        = ClassMapperFactory.GetMapper <T>(tableName);
            KeyConditionResult keyConditionResult = SqlGenerator.GetKeyConditionById(classMapper, id);
            SqlConvertResult   sqlConvertResult   = SqlGenerator.Select(classMapper, keyConditionResult.Sql, null, keyConditionResult.Parameters, false);
            T result = DbConnection.Query <T>(sqlConvertResult.Sql, sqlConvertResult.Parameters, DbTransaction, true, commandTimeout, CommandType.Text).SingleOrDefault();

            if (result == null)
            {
                return(null);
            }
            IPropertyMap persistedMap = classMapper.GetPersistedMap();

            if (persistedMap != null)
            {
                persistedMap.PropertyInfo.SetValue(result, true, null);
            }
            IPropertyMap propertyChangedListMap = classMapper.GetPropertyChangedListMap();

            if (propertyChangedListMap != null)
            {
                IList <string> changedList = propertyChangedListMap.PropertyInfo.GetValue(result, null) as IList <string>;
                if (changedList != null)
                {
                    changedList.Clear();
                }
            }
            return(result);
        }
コード例 #2
0
        public virtual KeyConditionResult GetKeyConditionById(IClassMapper classMapper, object id)
        {
            bool isSimpleType         = ReflectionHelper.IsSimpleType(id.GetType());
            KeyConditionResult result = new KeyConditionResult {
                Parameters = new DynamicParameters()
            };

            if (isSimpleType)
            {
                IPropertyMap property = classMapper.Properties.Single(p => p.KeyType != KeyType.NotAKey);
                result.Sql = string.Concat(DbProvider.OpenQuote, property.ColumnName, DbProvider.CloseQuote, "=", DbProvider.ParameterPrefix, property.Name);
                result.Parameters.Add(property.Name, id, property.DbType, null, property.Size);
            }
            else
            {
                var keys = classMapper.Properties.Where(p => p.KeyType != KeyType.NotAKey);
                IDictionary <string, object> paramValues = ReflectionHelper.GetObjectValues(id);
                List <string> list = new List <string>();
                foreach (IPropertyMap property in keys)
                {
                    list.Add(string.Concat(DbProvider.OpenQuote, property.ColumnName, DbProvider.CloseQuote, "=", DbProvider.ParameterPrefix, property.Name));
                    result.Parameters.Add(property.Name, paramValues[property.Name], property.DbType, null, property.Size);
                }
                result.Sql = list.AppendStrings(" AND ");
            }
            return(result);
        }
コード例 #3
0
        public bool Update <T>(T entity, string tableName = null, int?commandTimeout = null) where T : class
        {
            IClassMapper <T> classMapper = ClassMapperFactory.GetMapper <T>(tableName);

            classMapper.BeforeSave(entity);
            KeyConditionResult keyConditionResult = SqlGenerator.GetKeyConditionByEntity(classMapper, entity);

            if (classMapper.GetVersionMap() != null)
            {
                int oldVersion = (int)classMapper.GetVersionMap().PropertyInfo.GetValue(entity, null);
                keyConditionResult.Sql = string.Format("{0} AND {1}={2}", keyConditionResult.Sql,
                                                       SqlGenerator.DbProvider.QuoteString(classMapper.GetVersionMap().ColumnName), oldVersion);
                classMapper.GetVersionMap().PropertyInfo.SetValue(entity, oldVersion + 1, null);
            }
            SqlConvertResult sqlConvertResult = SqlGenerator.Update(classMapper, keyConditionResult.Sql, keyConditionResult.Parameters, entity);

            sqlConvertResult.Parameters.AddDynamicParams(entity);
            bool flag = DbConnection.Execute(sqlConvertResult.Sql, sqlConvertResult.Parameters, DbTransaction, commandTimeout, CommandType.Text) > 0;

            if (flag)
            {
                classMapper.AfterSave(entity);
            }
            return(flag);
        }
コード例 #4
0
        public bool Delete <T>(object id, string tableName = null, int?commandTimeout = null) where T : class
        {
            IClassMapper       classMapper        = ClassMapperFactory.GetMapper <T>(tableName);
            KeyConditionResult keyConditionResult = SqlGenerator.GetKeyConditionById(classMapper, id);
            SqlConvertResult   sqlConvertResult   = SqlGenerator.Delete(classMapper, keyConditionResult.Sql, keyConditionResult.Parameters);

            return(DbConnection.Execute(sqlConvertResult.Sql, sqlConvertResult.Parameters, DbTransaction, commandTimeout, CommandType.Text) > 0);
        }
コード例 #5
0
        public virtual KeyConditionResult GetKeyConditionByEntity <T>(IClassMapper classMapper, T entity) where T : class
        {
            var whereFields = classMapper.Properties.Where(p => p.KeyType != KeyType.NotAKey);

            if (!whereFields.Any())
            {
                throw new ArgumentException("必须定义一个主键列。");
            }
            KeyConditionResult result = new KeyConditionResult {
                Parameters = new DynamicParameters()
            };
            List <string> list = new List <string>();

            foreach (IPropertyMap property in whereFields)
            {
                list.Add(string.Concat(DbProvider.OpenQuote, property.ColumnName, DbProvider.CloseQuote, "=", DbProvider.ParameterPrefix, property.Name));
                result.Parameters.Add(property.Name, property.PropertyInfo.GetValue(entity, null), property.DbType, null, property.Size);
            }
            result.Sql = list.AppendStrings(" AND ");
            return(result);
        }