mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
AggregateRootRepository
This commit is contained in:
parent
115232277b
commit
4b0b0da643
@ -174,6 +174,60 @@ namespace FreeSql
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ConcurrentDictionary<Type, bool> _dicCompareEntityPropertyValue = new ConcurrentDictionary<Type, bool>
|
||||||
|
{
|
||||||
|
[typeof(string)] = true,
|
||||||
|
[typeof(DateTime)] = true,
|
||||||
|
[typeof(DateTime?)] = true,
|
||||||
|
[typeof(DateTimeOffset)] = true,
|
||||||
|
[typeof(DateTimeOffset?)] = true,
|
||||||
|
[typeof(TimeSpan)] = true,
|
||||||
|
[typeof(TimeSpan?)] = true,
|
||||||
|
};
|
||||||
|
public static bool CompareEntityPropertyValue(Type type, object propvalBefore, object propvalAfter)
|
||||||
|
{
|
||||||
|
if (propvalBefore == null && propvalAfter == null) return true;
|
||||||
|
if (type.IsNumberType() ||
|
||||||
|
_dicCompareEntityPropertyValue.ContainsKey(type) ||
|
||||||
|
type.IsEnum ||
|
||||||
|
type.NullableTypeOrThis().IsEnum ||
|
||||||
|
type.FullName.StartsWith("System.") ||
|
||||||
|
type.IsValueType) return object.Equals(propvalBefore, propvalAfter);
|
||||||
|
if (propvalBefore == null && propvalAfter != null) return false;
|
||||||
|
if (propvalBefore != null && propvalAfter == null) return false;
|
||||||
|
if (type.IsArrayOrList())
|
||||||
|
{
|
||||||
|
var enumableBefore = propvalBefore as IEnumerable;
|
||||||
|
var enumableAfter = propvalAfter as IEnumerable;
|
||||||
|
var itorBefore = enumableBefore.GetEnumerator();
|
||||||
|
var itorAfter = enumableAfter.GetEnumerator();
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
var moveNextBefore = itorBefore.MoveNext();
|
||||||
|
var moveNextAfter = itorAfter.MoveNext();
|
||||||
|
if (moveNextBefore != moveNextAfter) return false;
|
||||||
|
if (moveNextBefore == false) return true;
|
||||||
|
var currentBefore = itorBefore.Current;
|
||||||
|
var currentAfter = itorAfter.Current;
|
||||||
|
if (currentBefore == null && enumableAfter == null) continue;
|
||||||
|
if (currentBefore == null && currentAfter != null) return false;
|
||||||
|
if (currentBefore != null && currentAfter == null) return false;
|
||||||
|
if (CompareEntityPropertyValue(currentBefore.GetType(), currentBefore, currentAfter) == false) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (type.IsClass || type.IsInterface)
|
||||||
|
{
|
||||||
|
foreach (var prop in type.GetProperties())
|
||||||
|
{
|
||||||
|
var valBefore = prop.GetValue(propvalBefore, new object[0]);
|
||||||
|
var valAfter = prop.GetValue(propvalAfter, new object[0]);
|
||||||
|
if (CompareEntityPropertyValue(prop.PropertyType, valBefore, valAfter) == false) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return object.Equals(propvalBefore, propvalAfter);
|
||||||
|
}
|
||||||
|
|
||||||
public static void NavigateReader(IFreeSql fsql, Type rootType, object rootEntity, Action<string, TableRef, Type, List<object>> callback)
|
public static void NavigateReader(IFreeSql fsql, Type rootType, object rootEntity, Action<string, TableRef, Type, List<object>> callback)
|
||||||
{
|
{
|
||||||
Dictionary<Type, Dictionary<string, bool>> ignores = new Dictionary<Type, Dictionary<string, bool>>();
|
Dictionary<Type, Dictionary<string, bool>> ignores = new Dictionary<Type, Dictionary<string, bool>>();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user