mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
commit
86c6aac4c2
@ -1,6 +1,7 @@
|
|||||||
using FreeSql.Extensions.EntityUtil;
|
using FreeSql.Extensions.EntityUtil;
|
||||||
using FreeSql.Internal.Model;
|
using FreeSql.Internal.Model;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
@ -93,7 +94,10 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table, Dictionary<string, bool> changedDict)
|
public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table, Dictionary<string, bool> changedDict)
|
||||||
{
|
{
|
||||||
if (data == null || table == null) return;
|
if (data == null || table == null) return;
|
||||||
if (typeof(T1) == typeof(object) && new[] { table.Type, table.TypeLazy }.Contains(data.GetType()) == false)
|
if (typeof(T1) == typeof(object) && new[]
|
||||||
|
{
|
||||||
|
table.Type, table.TypeLazy
|
||||||
|
}.Contains(data.GetType()) == false)
|
||||||
throw new Exception(CoreStrings.DataType_AsType_Inconsistent(data.GetType().DisplayCsharp(), table.Type.DisplayCsharp()));
|
throw new Exception(CoreStrings.DataType_AsType_Inconsistent(data.GetType().DisplayCsharp(), table.Type.DisplayCsharp()));
|
||||||
if (orm.Aop.AuditValueHandler == null) return;
|
if (orm.Aop.AuditValueHandler == null) return;
|
||||||
foreach (var col in table.Columns.Values)
|
foreach (var col in table.Columns.Values)
|
||||||
@ -112,11 +116,32 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IInsertOrUpdate<T1> SetSource(T1 source) => this.SetSource(new[] { source });
|
public IInsertOrUpdate<T1> SetSource(T1 source) => this.SetSource(new[]
|
||||||
|
{
|
||||||
|
source
|
||||||
|
});
|
||||||
public IInsertOrUpdate<T1> SetSource(IEnumerable<T1> source, Expression<Func<T1, object>> tempPrimarys = null)
|
public IInsertOrUpdate<T1> SetSource(IEnumerable<T1> source, Expression<Func<T1, object>> tempPrimarys = null)
|
||||||
{
|
{
|
||||||
if (source == null || source.Any() == false) return this;
|
if (source == null || source.Any() == false) return this;
|
||||||
UpdateProvider<T1>.GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table);
|
if (source is IEnumerable<IDictionary<string, object>> dicType)
|
||||||
|
{
|
||||||
|
var tempDict = new Dictionary<string, object>();
|
||||||
|
foreach (var item in dicType)
|
||||||
|
{
|
||||||
|
foreach (string key in item.Keys)
|
||||||
|
{
|
||||||
|
if (!tempDict.ContainsKey(key) && !(item[key] is null))
|
||||||
|
{
|
||||||
|
tempDict[key] = item[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UpdateProvider<IDictionary>.GetDictionaryTableInfo(tempDict, _orm, ref _table);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateProvider<T1>.GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table);
|
||||||
|
}
|
||||||
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
|
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
|
||||||
_source.AddRange(source.Where(a => a != null));
|
_source.AddRange(source.Where(a => a != null));
|
||||||
|
|
||||||
@ -223,7 +248,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte _SplitSourceByIdentityValueIsNullFlag = 0; //防止重复计算 SplitSource
|
byte _SplitSourceByIdentityValueIsNullFlag = 0;//防止重复计算 SplitSource
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert
|
/// 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -232,15 +257,23 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
public NativeTuple<List<T1>[], List<T1>[]> SplitSourceByIdentityValueIsNull(List<T1> source)
|
public NativeTuple<List<T1>[], List<T1>[]> SplitSourceByIdentityValueIsNull(List<T1> source)
|
||||||
{
|
{
|
||||||
if (source.Any() == false) return NativeTuple.Create(new List<T1>[0], new List<T1>[0]);
|
if (source.Any() == false) return NativeTuple.Create(new List<T1>[0], new List<T1>[0]);
|
||||||
if (_SplitSourceByIdentityValueIsNullFlag == 1) return NativeTuple.Create(new[] { source }, new List<T1>[0]);
|
if (_SplitSourceByIdentityValueIsNullFlag == 1)
|
||||||
if (_SplitSourceByIdentityValueIsNullFlag == 2) return NativeTuple.Create(new List<T1>[0], new[] { source });
|
return NativeTuple.Create(new[]
|
||||||
|
{
|
||||||
|
source
|
||||||
|
}, new List<T1>[0]);
|
||||||
|
if (_SplitSourceByIdentityValueIsNullFlag == 2)
|
||||||
|
return NativeTuple.Create(new List<T1>[0], new[]
|
||||||
|
{
|
||||||
|
source
|
||||||
|
});
|
||||||
if (IdentityColumn == null || _tempPrimarys != _table.Primarys) return NativeTuple.Create(LocalSplitSourceByAsTable(source), new List<T1>[0]);
|
if (IdentityColumn == null || _tempPrimarys != _table.Primarys) return NativeTuple.Create(LocalSplitSourceByAsTable(source), new List<T1>[0]);
|
||||||
var item1 = new List<T1>();
|
var item1 = new List<T1>();
|
||||||
var item2 = new List<T1>();
|
var item2 = new List<T1>();
|
||||||
foreach (var item in source)
|
foreach (var item in source)
|
||||||
{
|
{
|
||||||
if (object.Equals(_orm.GetEntityValueWithPropertyName(_table.Type, item, IdentityColumn.CsName), IdentityColumn.CsType.CreateInstanceGetDefaultValue()))
|
if (object.Equals(_orm.GetEntityValueWithPropertyName(_table.Type, item, IdentityColumn.CsName), IdentityColumn.CsType.CreateInstanceGetDefaultValue()))
|
||||||
item2.Add(item); //自增无值的,记录为直接插入
|
item2.Add(item);//自增无值的,记录为直接插入
|
||||||
else
|
else
|
||||||
item1.Add(item);
|
item1.Add(item);
|
||||||
}
|
}
|
||||||
@ -258,7 +291,10 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
}).GroupBy(a => a.splitKey, a => a.item).Select(a => a.ToList()).ToArray();
|
}).GroupBy(a => a.splitKey, a => a.item).Select(a => a.ToList()).ToArray();
|
||||||
return atarr;
|
return atarr;
|
||||||
}
|
}
|
||||||
return new[] { loc1 };
|
return new[]
|
||||||
|
{
|
||||||
|
loc1
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,4 +487,4 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user