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); }
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); }
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); }
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); }
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); }