private UpdateDefinition <T> GetUpdateFiled <T>(T item, Expression <Func <T, object> > field) { try { var pInfo = PropertyCache.GetPropertyInfo <T>(); var dynGet = new DynamicGet <T>(); var fieldList = new List <UpdateDefinition <T> >(); var list = (field.Body as NewExpression).Members; foreach (var temp in list) { var itemValue = dynGet.GetValue(item, temp.Name); fieldList.Add(Builders <T> .Update.Set(temp.Name, itemValue)); } return(Builders <T> .Update.Combine(fieldList)); } catch (Exception ex) { Task.Run(() => { SaveLog <T>(ex, "UpdateDefinition<T>"); }).ConfigureAwait(false); return(null); } }
/// <summary> /// to list /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr"></param> /// <param name="dbType"></param> /// <returns></returns> public static List <T> ToList <T>(DbDataReader dr, ConfigModel config, List <string> field = null) where T : class, new() { var list = new List <T>(); var colList = new List <string>(); if (dr == null) { return(list); } if (dr.HasRows) { colList = GetCol(dr); } var propertyList = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache); while (dr.Read()) { var item = new T(); if (field == null || field.Count == 0) { foreach (var info in propertyList) { if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0)) { continue; } if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>)) { continue; } item = SetValue <T>(item, dr, info, config); } } else { for (var i = 0; i < field.Count; i++) { if (!colList.Exists(a => string.Compare(a, field[i], true) == 0)) { continue; } if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0)) { var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0); item = SetValue <T>(item, dr, info, config); } } } list.Add(item); } return(list); }
/// <summary> /// 获取表结构 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cmd"></param> /// <returns></returns> public static DataTable ToDataTable <T>(DbCommand cmd, ConfigModel config, List <string> where, Expression <Func <T, object> > field = null) { var dt = new DataTable(); var sql = new List <string>(); if (field == null) { PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(a => { sql.Add(a.Name); }); } else { (field.Body as NewExpression).Members.ToList().ForEach(a => { sql.Add(a.Name); }); } where.ForEach(a => { sql.Add(a); }); cmd.CommandText = string.Format("select {1} from {0} where 1=0", typeof(T).Name, string.Join(",", sql.ToArray())); var dr = cmd.ExecuteReader(); dt.Load(dr); dr.Close(); dr.Dispose(); return(dt); }
/// <summary> /// to model /// </summary> /// <param name="model"></param> /// <param name="dr"></param> /// <param name="config"></param> /// <param name="field"></param> /// <returns></returns> public static Object ToModel(Object model, DbDataReader dr, ConfigModel config, List <string> field = null) { var result = Activator.CreateInstance(model.GetType()); var colList = new List <string>(); if (dr == null) { return(null); } if (dr.HasRows) { colList = GetCol(dr); } var propertyList = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache); while (dr.Read()) { if (field == null || field.Count == 0) { foreach (var info in propertyList) { if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0)) { continue; } if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>)) { continue; } result = SetValue(result, dr, info, config); } } else { for (var i = 0; i < field.Count; i++) { if (!colList.Exists(a => string.Compare(a, field[i], true) == 0)) { continue; } if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0)) { var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0); result = SetValue(result, dr, info, config); } } } } return(result); }
/// <summary> /// 获取datatabel /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <returns></returns> public static DataTable GetTable <T>(DbCommand cmd, List <T> list) { var dt = new DataTable(); cmd.CommandText = string.Format("select top 1 * from {0}", typeof(T).Name); dt.Load(cmd.ExecuteReader()); dt.Clear(); list.ForEach(p => { var row = dt.NewRow(); PropertyCache.GetPropertyInfo <T>().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); }); dt.Rows.Add(row); }); return(dt); }
/// <summary> /// Creates the instance. /// </summary> /// <returns></returns> public object CreateInstance(IRuntimeType instance) { var obj = Activator.CreateInstance(instance.ActivatorType); var runtimeTypes = instance.RuntimeTypes.ToArray(); for (int i = 0; i < runtimeTypes.Length; i++) { var runtimeType = runtimeTypes[i]; var value = runtimeType.GetValue(instance.Attribute, instance.Id); var propertyInfo = PropertyCache.GetPropertyInfo(runtimeType); propertyInfo.SetValue(obj, value); } return(obj); }
/// <summary> /// model 转 insert sql /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="model">实体</param> /// <param name="sql">sql</param> /// <param name="oracleParam">参数</param> /// <returns></returns> public static OptionModel InsertToSql <T>(T model, ConfigModel config) { var sbName = new StringBuilder(); var sbValue = new StringBuilder(); var list = new List <MemberInfo>(); var result = new OptionModel(); try { sbName.AppendFormat("insert into {0} (", typeof(T).Name); sbValue.Append(" values ("); PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(p => { if (!list.Exists(a => a.Name == p.Name)) { sbName.AppendFormat("{0},", p.Name); sbValue.AppendFormat("{1}{0},", p.Name, config.Flag); var itemValue = BaseEmit.Get <T>(model, p.Name); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = p.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); } }); result.Sql = string.Format("{0}) {1})", sbName.ToString().Substring(0, sbName.ToString().Length - 1) , sbValue.ToString().Substring(0, sbValue.ToString().Length - 1)); result.IsSuccess = true; return(result); } catch (Exception ex) { if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0) { DbLogTable.LogException(config, ex, "InsertToSql<T>", result.Sql); } else { DbLog.LogException(config.IsOutError, config.DbType, ex, "InsertToSql<T>", result.Sql); } result.IsSuccess = false; return(result); } }
/// <summary> /// tvsps sql /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dyn"></param> /// <returns></returns> public static string GetTvps <T>() { var sql1 = new StringBuilder(); var sql2 = new StringBuilder(); sql1.AppendFormat("insert into {0} (", typeof(T).Name); sql2.Append("select "); PropertyCache.GetPropertyInfo <T>().ForEach(a => { sql1.AppendFormat("{0},", a.Name); sql2.AppendFormat("tb.{0},", a.Name); }); sql1.Append(")"); sql2.AppendFormat("from @{0} as tb", typeof(T).Name); return(string.Format("{0}{1}", sql1.ToString().Replace(",)", ") "), sql2.ToString().Replace(",from", " from"))); }
/// <summary> /// mysql /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static string GetMySql <T>(List <T> list) { var sql = new StringBuilder(); sql.AppendFormat("insert into {0}(", typeof(T).Name); PropertyCache.GetPropertyInfo <T>().ForEach(a => { sql.AppendFormat("{0},", a.Name); }); sql.Append(")").Replace(",)", ")"); list.ForEach(a => { sql.Append("("); PropertyCache.GetPropertyInfo <T>().ForEach(p => { sql.AppendFormat("'{0}',", BaseEmit.Get <T>(a, p.Name)); }); sql.Append("),").Replace(",)", ")"); }); return(sql.ToStr().Substring(0, sql.ToStr().Length - 1)); }
/// <summary> /// mysql /// </summary> /// <param name="list"></param> /// <returns></returns> public static string GetMySql(List <object> list) { var sql = new StringBuilder(); sql.AppendFormat("insert into {0}(", list[0].GetType().Name); PropertyCache.GetPropertyInfo(list[0]).ForEach(a => { sql.AppendFormat("{0},", a.Name); }); sql.Append(")").Replace(",)", ")"); list.ForEach(a => { sql.Append("("); PropertyCache.GetPropertyInfo(list[0]).ForEach(b => { sql.AppendFormat("'{0}',", BaseEmit.Get(a, b.Name)); }); sql.Append("),").Replace(",)", ")"); }); return(sql.ToStr().Substring(0, sql.ToStr().Length - 1)); }
/// <summary> /// mysql /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static string GetMySql <T>(List <T> list) { var sql = new StringBuilder(); sql.AppendFormat("insert into {0}(", typeof(T).Name); var dyn = new Property.DynamicGet <T>(); PropertyCache.GetPropertyInfo <T>().ForEach(a => { sql.AppendFormat("{0},", a.Name); }); sql.Append(")").Replace(",)", ")"); list.ForEach(a => { sql.Append("("); PropertyCache.GetPropertyInfo <T>().ForEach(b => { sql.AppendFormat("'{0}',", dyn.GetValue(a, b.Name, true)); }); sql.Append("),").Replace(",)", ")"); }); return(sql.ToStr().Substring(0, sql.ToStr().Length - 1)); }
/// <summary> /// 获取datatabel /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <returns></returns> public static DataTable GetTable(DbCommand cmd, List <object> list, System.Type type) { var dt = new DataTable(); cmd.CommandText = string.Format("select top 1 * from {0}", type.Name); dt.Load(cmd.ExecuteReader()); dt.Clear(); list.ForEach(a => { var row = dt.NewRow(); PropertyCache.GetPropertyInfo(list[0]).ForEach(p => { row[p.Name] = BaseEmit.Get(a, p.Name); }); dt.Rows.Add(row); }); return(dt); }
/// <summary> /// query field 2个表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="field"></param> /// <returns></returns> public static FieldModel QueryField <T, T1>(Expression <Func <T, T1, bool> > predicate, Expression <Func <T1, object> > field, DataQuery query) { try { var result = new FieldModel(); var queryFields = new List <string>(); var asName = ""; if (field == null) { var list = PropertyCache.GetPropertyInfo <T1>(query.Config.IsPropertyCache); asName = query.TableAsName.GetValue(predicate.Parameters[1].Type.Name).ToString(); list.ForEach(a => { queryFields.Add(string.Format("{0}.{1}", asName, a.Name)); result.AsName.Add(a.Name); }); result.Field = string.Join(",", queryFields); return(result); } var i = 0; asName = query.TableAsName.GetValue(predicate.Parameters[0].Type.Name).ToString(); (field.Body as NewExpression).Arguments.ToList().ForEach(a => { if (a is MethodCallExpression) { var methodName = ""; var ower = ""; var propertyName = GetPropertyMethod(a, out methodName, true, out ower); if (string.Compare(methodName, "distinct", true) == 0) { queryFields.Add(string.Format("{2}{0} {2}.{1}", methodName, propertyName, ower, asName)); result.AsName.Add((a as MemberExpression).Member.Name); } else if (string.Compare(methodName, "sum", true) == 0) { if (query.Config.DbType == DataDbType.SqlServer) { propertyName = string.Format("isnull({1}.{0},0)", propertyName, asName); } if (query.Config.DbType == DataDbType.MySql || query.Config.DbType == DataDbType.SQLite) { propertyName = string.Format("ifnull({1}.{0},0)", propertyName, asName); } if (query.Config.DbType == DataDbType.Oracle) { propertyName = string.Format("nvl({1}.{0},0)", propertyName, asName); } if (query.Config.DbType == DataDbType.DB2) { propertyName = string.Format("coalesce({1}.{0},0)", propertyName, asName); } queryFields.Add(string.Format("{0}({2}.{1})", methodName, propertyName, asName)); result.AsName.Add((field.Body as NewExpression).Members[i].Name); } else { queryFields.Add(string.Format("{2}{0}({3}.{1})", methodName, propertyName, ower, asName)); result.AsName.Add((field.Body as NewExpression).Members[i].Name); } } else { if (a is MemberExpression) { var express = (a as MemberExpression).Expression; asName = query.TableAsName.GetValue(express.Type.Name).ToString(); queryFields.Add(string.Format("{0}.{1}", asName, (a as MemberExpression).Member.Name)); result.AsName.Add((a as MemberExpression).Member.Name); } } i++; }); result.Field = string.Join(",", queryFields); return(result); } catch (Exception ex) { if (query.Config.SqlErrorType == SqlErrorType.Db) { DbLogTable.LogException <T>(query.Config, ex, "QueryField<T1,T2,T>", ""); } else { DbLog.LogException(query.Config.IsOutError, query.Config.DbType, ex, "QueryField<T1,T2,T>", ""); } return(new FieldModel { Field = "*" }); } }
/// <summary> /// model 转 update list sql /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="model">实体</param> /// <param name="sql">sql</param> /// <param name="oracleParam">参数</param> /// <returns></returns> public static OptionModel UpdateListToSql <T>(DbCommand cmd, List <T> list, ConfigModel config, Expression <Func <T, object> > field = null) { var result = new OptionModel(); result.IsCache = config.IsPropertyCache; var where = PrimaryKey(config, cmd, typeof(T)); if (where.Count == 0) { result.Message = string.Format("{0}没有主键", typeof(T).Name); result.IsSuccess = false; return(result); } try { result.table = BaseExecute.ToDataTable <T>(cmd, config, where, field); result.Sql = string.Format("update {0} set", typeof(T).Name); var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache); if (field == null) { #region 属性 foreach (var item in pInfo) { if (where.Exists(a => a == item.Name)) { continue; } result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = item.Name; temp.SourceColumn = item.Name; result.Param.Add(temp); } #endregion } else { #region lambda foreach (var item in (field.Body as NewExpression).Members) { if (where.Exists(a => a == item.Name)) { continue; } result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = item.Name; temp.SourceColumn = item.Name; result.Param.Add(temp); } #endregion } result.Sql = result.Sql.Substring(0, result.Sql.Length - 1); var count = 1; where.ForEach(a => { if (count == 1) { result.Sql = string.Format("{2} where {0}={1}{0} ", a, config.Flag, result.Sql); } else { result.Sql = string.Format("{2} and {0}={1}{0} ", a, config.Flag, result.Sql); } var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = a; temp.SourceColumn = a; result.Param.Add(temp); count++; }); result.IsSuccess = true; list.ForEach(p => { var row = result.table.NewRow(); where.ForEach(a => { row[a] = BaseEmit.Get <T>(p, a); }); if (field == null) { PropertyCache.GetPropertyInfo <T>().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); }); } else { (field.Body as NewExpression).Members.ToList().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); }); } result.table.Rows.Add(row); }); return(result); } catch (Exception ex) { if (config.SqlErrorType == SqlErrorType.Db) { DbLogTable.LogException <T>(config, ex, "UpdateListToSql<T>", result.Sql); } else { DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateListToSql<T>", result.Sql); } result.IsSuccess = false; return(result); } }
/// <summary> /// model 转 update sql /// </summary> /// <param name="cmd"></param> /// <param name="model"></param> /// <param name="config"></param> /// <returns></returns> public static OptionModel UpdateToSql(DbCommand cmd, object model, ConfigModel config) { var result = new OptionModel(); result.IsCache = config.IsPropertyCache; var where = PrimaryKey(config, cmd, model.GetType()); if (where.Count == 0) { result.Message = string.Format("{0}没有主键", model.GetType().Name); result.IsSuccess = false; return(result); } try { result.Sql = string.Format("update {0} set", model.GetType().Name); var pInfo = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache); foreach (var item in pInfo) { if (where.Exists(a => a == item.Name)) { continue; } result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql); var itemValue = BaseEmit.Get(model, item.Name); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = item.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); } result.Sql = result.Sql.Substring(0, result.Sql.Length - 1); var count = 1; foreach (var item in where) { var itemValue = BaseEmit.Get(model, item); if (itemValue == null) { result.IsSuccess = false; result.Message = string.Format("主键{0}值为空", item); return(result); } if (count == 1) { result.Sql = string.Format("{2} where {0}={1}{0} ", item, config.Flag, result.Sql); } else { result.Sql = string.Format("{2} and {0}={1}{0} ", item, config.Flag, result.Sql); } var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = item; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); count++; } result.IsSuccess = true; return(result); } catch (Exception ex) { if (config.SqlErrorType == SqlErrorType.Db) { DbLogTable.LogException(config, ex, "UpdateToSql", result.Sql); } else { DbLog.LogException(config.IsOutError, config.DbType, ex, "UpdateToSql", result.Sql); } result.IsSuccess = false; return(result); } }
/// <summary> /// 服务参数 /// </summary> /// <param name="info"></param> /// <param name="model"></param> private static void ServiceParam(MethodInfo info, ServiceModel model, ConfigModel config) { if (info.ReturnType != typeof(WriteReturn) && model.isWrite) { throw new Exception($"[return type only WriteReturn, service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]"); } if (string.IsNullOrEmpty(model.dbKey)) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, dbkey is not null]"); } if (info.ReturnType.isSysType()) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]"); } if (string.IsNullOrEmpty(model.sql) && !model.isXml) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, sql is not null]"); } if (model.isPage && !info.GetParameters().ToList().Exists(a => a.ParameterType == typeof(PageModel))) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, read data by page , parameter type:{typeof(PageModel).FullName} not exists]"); } if (info.GetParameters().Length == 1 && info.GetParameters()[0].ParameterType.IsGenericType) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, parameter type:{info.GetParameters()[0].ParameterType} is not support]"); } if (model.isPage && info.ReturnType.GetGenericArguments().Length > 0 && info.ReturnType == typeof(PageResult <>).MakeGenericType(new System.Type[] { info.ReturnType.GetGenericArguments()[0] })) { model.type = info.ReturnType.GetGenericArguments()[0]; } else if (model.isPage && info.ReturnType == typeof(PageResult)) { model.type = null; } else if (model.isPage) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, read data by page , return type:{info.ReturnType} is not support]"); } if (info.ReturnType == typeof(Dictionary <string, object>) && (!model.isWrite || model.isXml)) { model.isList = false; } else if (info.ReturnType == typeof(List <Dictionary <string, object> >) && (!model.isWrite || model.isXml)) { model.isList = true; } else if (!model.isWrite || model.isXml) { model.isList = info.ReturnType.GetGenericArguments().Length > 0; System.Type argType; if (model.isList) { argType = info.ReturnType.GetGenericArguments()[0]; } else { argType = info.ReturnType; } if (argType.isSysType()) { throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]"); } } var dic = new Dictionary <int, string>(); if (info.GetParameters().ToList().Exists(a => a.ParameterType == typeof(Dictionary <string, object>))) { model.isDic = true; } else if (!info.GetParameters().ToList().Exists(a => a.ParameterType.isSysType())) { var type = info.GetParameters().ToList().Find(a => a.ParameterType != typeof(PageModel)).ParameterType; var pro = PropertyCache.GetPropertyInfo(Activator.CreateInstance(type)); pro.ForEach(a => { var key = string.Format("{0}{1}", config.Flag, a.Name).ToLower(); if (!model.isXml && model.sql.IndexOf(key) > 0) { dic.Add(model.sql.IndexOf(key), a.Name); } }); } else { for (int i = 0; i < info.GetParameters().Length; i++) { var key = string.Format("{0}{1}", config.Flag, info.GetParameters()[i].Name).ToLower(); if (!model.isXml && model.sql.IndexOf(key) > 0) { dic.Add(model.sql.IndexOf(key), info.GetParameters()[i].Name.ToLower()); } } model.isSysType = true; } var list = dic.OrderBy(d => d.Key).ToList(); for (int i = 0; i < list.Count; i++) { model.param.Add(i.ToString(), dic[list[i].Key]); } }
/// <summary> /// model 转 update sql /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="model">实体</param> /// <param name="sql">sql</param> /// <param name="oracleParam">参数</param> /// <returns></returns> public static OptionModel UpdateToSql <T>(DbCommand cmd, T model, ConfigModel config, Expression <Func <T, object> > field = null) { var result = new OptionModel(); result.IsCache = config.IsPropertyCache; var where = PrimaryKey(config, cmd, typeof(T)); if (where.Count == 0) { result.Message = string.Format("{0}没有主键", typeof(T).Name); result.IsSuccess = false; return(result); } try { result.Sql = string.Format("update {0} set", typeof(T).Name); var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache); if (field == null) { #region 属性 foreach (var item in pInfo) { if (where.Exists(a => a == item.Name)) { continue; } result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql); var itemValue = BaseEmit.Get <T>(model, item.Name); var temp = DbProviderFactories.GetFactory(config).CreateParameter(); temp.ParameterName = item.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); } #endregion } else { #region lambda var list = (field.Body as NewExpression).Members; foreach (var item in list) { if (where.Exists(a => a == item.Name)) { continue; } result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql); var itemValue = BaseEmit.Get <T>(model, item.Name); var temp = DbProviderFactories.GetFactory(config).CreateParameter(); temp.ParameterName = item.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); } #endregion } result.Sql = result.Sql.Substring(0, result.Sql.Length - 1); var count = 1; foreach (var item in where) { var itemValue = BaseEmit.Get <T>(model, item); if (itemValue == null) { result.IsSuccess = false; result.Message = string.Format("主键{0}值为空", item); return(result); } if (count == 1) { result.Sql = string.Format("{2} where {0}={1}{0} ", item, config.Flag, result.Sql); } else { result.Sql = string.Format("{2} and {0}={1}{0} ", item, config.Flag, result.Sql); } var temp = DbProviderFactories.GetFactory(config).CreateParameter(); temp.ParameterName = item; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); count++; } result.IsSuccess = true; return(result); } catch (Exception ex) { if (config.SqlErrorType == SqlErrorType.Db) { DbLogTable.LogException <T>(config, ex, "UpdateToSql<T>", result.Sql); } else { DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql); } result.IsSuccess = false; return(result); } }
/// <summary> /// model 转 update sql /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="model">实体</param> /// <param name="sql">sql</param> /// <param name="oracleParam">参数</param> /// <returns></returns> public static OptionModel UpdateToSql <T>(T model, ConfigModel config, Expression <Func <T, object> > field = null) { var result = new OptionModel(); var dynGet = new DynamicGet <T>(); result.IsCache = config.IsPropertyCache; try { result.Sql = string.Format("update {0} set", typeof(T).Name); var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache); if (field == null) { #region 属性 pInfo.ForEach(a => { result.Sql = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql); var itemValue = dynGet.GetValue(model, a.Name, config.IsPropertyCache); var temp = DbProviderFactories.GetFactory(config).CreateParameter(); temp.ParameterName = a.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); }); #endregion } else { #region lambda (field.Body as NewExpression).Members.ToList().ForEach(a => { result.Sql = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql); var itemValue = dynGet.GetValue(model, a.Name, config.IsPropertyCache); var temp = DbProviderFactories.GetFactory(config).CreateParameter(); temp.ParameterName = a.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); }); #endregion } result.Sql = result.Sql.Substring(0, result.Sql.Length - 1); result.IsSuccess = true; return(result); } catch (Exception ex) { Task.Run(() => { if (config.SqlErrorType == SqlErrorType.Db) { DbLogTable.LogException <T>(config, ex, "UpdateToSql<T>", result.Sql); } else { DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql); } }); result.IsSuccess = false; return(result); } }
/// <summary> /// 比对model /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="CacheItem">缓存实体</param> /// <param name="modelItem">实体</param> /// <returns></returns> public static CompareModel <T> CompareTo <T>(T CacheItem, T modelItem) where T : class, new() { var dynGet = new Property.DynamicGet <T>(); var dynSet = new Property.DynamicSet <T>(); var result = new CompareModel <T>(); result.Item = modelItem; if (modelItem == null) { result.RemoveName.Add(dynGet.GetValue(CacheItem, "Name", true).ToStr()); result.IsDelete = true; return(result); } var type = dynGet.GetValue(modelItem, "DataType", true).ToStr(); if (type == "") { type = dynGet.GetValue(CacheItem, "DataType", true).ToStr(); } var name = dynGet.GetValue(modelItem, "Name", true).ToStr(); if (name == "") { name = dynGet.GetValue(CacheItem, "Name", true).ToStr(); result.Item = CacheItem; } foreach (var info in PropertyCache.GetPropertyInfo <T>()) { var modelValue = dynGet.GetValue(modelItem, info.Name, true); var cacheValue = dynGet.GetValue(CacheItem, info.Name, true); dynSet.SetValue(result.Item, info.Name, modelValue, true); if ((modelValue != null && cacheValue != null && modelValue.ToStr().ToLower() != cacheValue.ToStr().ToLower()) || (modelValue == null && cacheValue != null) || (modelValue != null && cacheValue == null)) { result.IsUpdate = true; switch (info.Name) { case "IsKey": { if (!(bool)modelValue) { result.RemoveKey.Add(name); } if ((bool)modelValue) { result.AddKey.Add(GetColumnType <T>(modelItem, type, name)); } break; } case "IsNull": { if (!(bool)modelValue) { result.RemoveNull.Add(GetColumnType <T>(modelItem, type, name)); } if ((bool)modelValue) { result.AddNull.Add(GetColumnType <T>(modelItem, type, name)); } break; } case "Name": { if (modelValue == null) { result.RemoveName.Add(name); } if (modelValue != null) { result.AddName.Add(GetColumnType <T>(modelItem, type, name)); } break; } case "Length": case "Precision": case "Scale": { result.Type.Add(GetColumnType <T>(modelItem, type, name)); break; } case "DataType": { result.Type.Add(GetColumnType <T>(modelItem, modelValue, name)); break; } case "Comments": { result.Comments.Add(new ColumnComments { Comments = modelValue.ToStr(), Name = name, Type = GetColumnType <T>(modelItem, type, name) }); break; } default: break; } } } return(result); }
/// <summary> /// to list /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dr"></param> /// <param name="dbType"></param> /// <returns></returns> public static IList ToList(System.Type type, Object model, DbDataReader dr, ConfigModel config, List <string> field = null) { var list = Activator.CreateInstance(type); var colList = new List <string>(); if (dr == null) { return(null); } if (dr.HasRows) { colList = GetCol(dr); } var propertyList = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache); while (dr.Read()) { var item = Activator.CreateInstance(model.GetType()); if (field == null || field.Count == 0) { foreach (var info in propertyList) { if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0)) { continue; } if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>)) { continue; } item = SetValue(item, dr, info, config); } } else { for (var i = 0; i < field.Count; i++) { if (!colList.Exists(a => string.Compare(a, field[i], true) == 0)) { continue; } if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0)) { var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0); item = SetValue(item, dr, info, config); } } } list.GetType().GetMethods().ToList().ForEach(m => { if (m.Name == "Add") { BaseEmit.Invoke(list, m, new object[] { item }); } }); } return((IList)list); }
/// <summary> /// query field 1个表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="field"></param> /// <returns></returns> public static FieldModel QueryField <T>(Expression <Func <T, bool> > predicate, Expression <Func <T, object> > field, ConfigModel config) { try { var result = new FieldModel(); var queryFields = new List <string>(); var i = 0; if (field == null) { #region 无返回列 var list = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache); list.ForEach(a => { queryFields.Add(string.Format("{0}.{1}", predicate.Parameters[0].Name, a.Name)); result.AsName.Add(a.Name); }); result.Field = string.Join(",", queryFields); #endregion } else { #region 返回列 (field.Body as NewExpression).Arguments.ToList().ForEach(a => { if (a is MethodCallExpression) { var methodName = ""; var ower = ""; var propertyName = GetPropertyMethod(a, out methodName, false, out ower); if (string.Compare(methodName, "distinct", true) == 0) { queryFields.Add(string.Format("{2}{0} {3}.{1} ", methodName, propertyName, ower, predicate.Parameters[0].Name)); result.AsName.Add((a as MemberExpression).Member.Name); } else if (string.Compare(methodName, "sum", true) == 0) { if (config.DbType == DataDbType.SqlServer) { propertyName = string.Format("isnull({1}.{0},0)", propertyName, predicate.Parameters[0].Name); } if (config.DbType == DataDbType.MySql || config.DbType == DataDbType.SQLite) { propertyName = string.Format("ifnull({1}.{0},0)", propertyName, predicate.Parameters[0].Name); } if (config.DbType == DataDbType.Oracle) { propertyName = string.Format("nvl({1}.{0},0)", propertyName, predicate.Parameters[0].Name); } if (config.DbType == DataDbType.DB2) { propertyName = string.Format("coalesce({1}.{0},0)", propertyName, predicate.Parameters[0].Name); } queryFields.Add(string.Format("{0}({2}.{1})", methodName, propertyName, predicate.Parameters[0].Name)); result.AsName.Add((field.Body as NewExpression).Members[i].Name); } else { queryFields.Add(string.Format("{2}{0}({3}.{1})", methodName, propertyName, ower, predicate.Parameters[0].Name)); result.AsName.Add((field.Body as NewExpression).Members[i].Name); } } else { queryFields.Add(string.Format("{0}.{1}", predicate.Parameters[0].Name, (a as MemberExpression).Member.Name)); result.AsName.Add((a as MemberExpression).Member.Name); } i++; }); #endregion } result.Field = string.Join(",", queryFields); return(result); } catch (Exception ex) { if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0) { DbLogTable.LogException <T>(config, ex, "QueryField<T>", ""); } else { DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "QueryField<T>", ""); } return(new FieldModel { Field = string.Format("{0}.*", predicate.Parameters[0].Name), AsName = new List <string> { predicate.Parameters[0].Name } }); } }
/// <summary> /// model 转 update sql /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="model">实体</param> /// <param name="sql">sql</param> /// <param name="oracleParam">参数</param> /// <returns></returns> public static OptionModel UpdateToSql <T>(T model, ConfigModel config, Expression <Func <T, object> > field = null, DbCommand cmd = null) { var result = new OptionModel(); result.IsCache = config.IsPropertyCache; var where = PrimaryKey(config, cmd, typeof(T)); try { result.Sql = string.Format("update {0} set", typeof(T).Name); if (field == null) { #region 属性 PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(a => { result.Sql = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql); var itemValue = BaseEmit.Get <T>(model, a.Name); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = a.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); }); #endregion } else { #region lambda (field.Body as NewExpression).Members.ToList().ForEach(a => { result.Sql = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql); var itemValue = BaseEmit.Get <T>(model, a.Name); var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter(); temp.ParameterName = a.Name; temp.Value = itemValue == null ? DBNull.Value : itemValue; result.Param.Add(temp); }); #endregion } foreach (var item in where) { if (result.Param.Exists(a => a.ParameterName == item)) { var itemValue = BaseEmit.Get <T>(model, item); if (itemValue == null) { result.IsSuccess = false; result.Message = string.Format("主键{0}值为空", item); return(result); } } } result.Sql = result.Sql.Substring(0, result.Sql.Length - 1); result.IsSuccess = true; return(result); } catch (Exception ex) { if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0) { DbLogTable.LogException(config, ex, "UpdateToSql<T>", result.Sql); } else { DbLog.LogException(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql); } result.IsSuccess = false; return(result); } }