对象比较(适用于是否需要更新数据库记录)

我们在做数据入库的是否,经常要查询是否需要对已存在的数据做更新。

除了直接将对象信息带入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;
        }
    }

有需要的欢迎自取,个人使用频率还是较高的。

对象比较(适用于是否需要更新数据库记录)

上一篇:ADB server didn‘t ACK启动失败


下一篇:oracle 11g RAC 的一些基本概念(四)