/// <summary> /// 获取加密码 /// </summary> /// <param name="entity"></param> /// <returns></returns> public static string GetSecretCode(this ISecretCode entity) { Type etype = entity.GetType(); PropertyInfo[] props = etype.GetProperties(); List <string> strList = new List <string>(); //遍历实体属性进行赋值 foreach (PropertyInfo pi in props) { var fieldName = pi.Name; if (fieldName == "SecretCode") { continue; } string str = fieldName; //非值类型,跳过 if (!ObjectExtession.IsValueType(pi.PropertyType)) { continue; } var piValue = pi.GetValue(entity); if (piValue == null) { continue; } else { str += "=" + piValue; } strList.Add(str); } return(string.Join("&", strList).GetMd5()); }
/// <summary> /// 获取第一行数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static T SqlQueryFirst <T>(this DbContext db, string sql, params DbParameter[] parameters) //where T : class,new() { var conn = db.Database.GetDbConnection(); try { if (conn.State != ConnectionState.Open) { conn.Open(); } using (var reader = PreCommandReader(db.Database, sql, parameters)) { T model = Activator.CreateInstance <T>(); var type = typeof(T); var propts = type.GetProperties(); if (reader.Read()) { if (ObjectExtession.IsValueType(type))//增加对可空类型和string datetime兼容 { return((T)ObjectExtession.DbChangeType(reader[0], type)); } else { foreach (var propt in propts) { object value = reader[propt.Name]; propt.SetValue(model, value == DBNull.Value ? null : value); } } } else { throw new Exception("SqlQueryFirst未读取到任何数据"); } return(model); } } finally { conn.Close(); } }
/// <summary> /// 对比两个实体不同部分并赋值(排除主键、创建时间和创建人) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity">被赋值实体</param> /// <param name="data">提供更新值的实体(可以与被赋值实体类型相同或不同)</param> public void CompareValueAndassign <T>(TEntity entity, T data) { var entityEntry = Context.Entry(entity); Type etype = entity.GetType(); PropertyInfo[] eprops = etype.GetProperties(); Type dtype = data.GetType(); PropertyInfo[] dprops = dtype.GetProperties(); //遍历实体属性进行赋值 foreach (PropertyInfo pi in eprops) { var fieldName = pi.Name; if (fieldName == "Createdtime" || fieldName == "CreatedEmp" || fieldName == "UpdatedEmp" || fieldName == "Updatedtime") { continue; } //不在新数据中 var dpi = FindPropertyInfo(dprops, fieldName); if (dpi == null) { continue; } //忽略主键 var fieldProp = entityEntry.Property(fieldName); if (fieldProp != null && fieldProp.Metadata.IsPrimaryKey()) { continue; } //非值类型,跳过 if (!ObjectExtession.IsValueType(pi.PropertyType)) { continue; } //todo 这里可以自己定义一个Attribute 更专门 需要忽略掉的属性 if (Attribute.IsDefined(pi.PropertyType, typeof(DescriptionAttribute))) { continue; } var piValue = pi.GetValue(entity); var dpiValue = dpi.GetValue(data); if (piValue == null || dpiValue == null) { if (piValue == null && dpiValue == null) { continue; } } else { //判断值是否相等 Equals是字符串类型的比较方法,所以基本类型全部转换成字符串比较,null值ToString会报错,要使用他内部的方法。 if (piValue.Equals(dpiValue)) { continue; } } //属性修改 SetFieldValue(entity, fieldName, dpiValue); } }