我们在做数据入库的是否,经常要查询是否需要对已存在的数据做更新。
除了直接将对象信息带入Where条件之外,还有没有更加灵活的方式呢?
下面介绍一种对象比较方式,可以灵活的过滤不想或不需要比较的属性。
代码实现如下:
/// <summary> /// 对象比较 /// </summary> public static class ObjCompareUtil { /// <summary> /// 判断两个相同引用类型的对象的属性值是否相等 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj1">对象1</param> /// <param name="obj2">对象2</param> /// <param name="type">按type类型中的属性进行比较</param> /// <returns></returns> public static bool CompareProperties<T>(T obj1, T obj2, Type type,Dictionary<string,int> IngoreParams=null) { //为空判断 if (obj1 == null && obj2 == null) return true; else if (obj1 == null || obj2 == null) return false; Type t = type; PropertyInfo[] props = t.GetProperties(); foreach (var po in props) { if(null!=IngoreParams&&IngoreParams.ContainsKey(po.Name)){ continue; } if (IsCanCompare(po.PropertyType)) { if (!po.GetValue(obj1).Equals(po.GetValue(obj2))) { return false; } } else { return CompareProperties(po.GetValue(obj1), po.GetValue(obj2), po.PropertyType); } } return true; } /// <summary> /// 该类型是否可直接进行值的比较 /// </summary> /// <param name="t"></param> /// <returns></returns> private static bool IsCanCompare(Type t) { if (t.IsValueType) { return true; } else { //String是特殊的引用类型,它可以直接进行值的比较 if (t.FullName == typeof(String).FullName) { return true; } return false; } } /// <summary> /// 从IDataReader读取成对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="idr"></param> /// <returns></returns> public static T ReadFromIDataReader<T>(IDataReader idr) where T : class { object record = Activator.CreateInstance(typeof(T), null);//创建指定类型实例 foreach (PropertyInfo property in record.GetType().GetProperties()) { if (idr[$"{property.Name}"] != DBNull.Value) { object value; value = Convert.ChangeType(idr[$"{property.Name}"], (Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType)); property.SetValue(record, value, null); } } return (T)record; } }
有需要的欢迎自取,个人使用频率还是较高的。