diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 2711e35d..3f9fb047 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -99,13 +99,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index df1dff9a..287db677 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -418,9 +418,33 @@ namespace FreeSql.Tests public enum TestAddEnumType { 中国人, 日本人 } public static AsyncLocal TenrantId { get; set; } = new AsyncLocal(); + + public class TestAddEnumEx : TestAddEnum + { + public new int Id { get; set; } + } + [Fact] public void Test1() { + var testExNewRet1 = g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + var testExNewRet2 = g.sqlite.Insert(new TestAddEnumEx { Id = 1, Type = TestAddEnumType.中国人 }).ExecuteAffrows(); + var testExNewRet3 = g.sqlite.Insert(new TestAddEnumEx { Id = 2, Type = TestAddEnumType.日本人 }).ExecuteAffrows(); + var testExNewRet4 = g.sqlite.Select().ToList(); + var testExNewRet5 = g.sqlite.Update(1).Set(a => a.Type == TestAddEnumType.日本人).ExecuteAffrows(); + var testExNewRet6 = g.sqlite.Select().ToList(); + var testExNewRet7 = g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + var testExNewRet8 = g.sqlite.Select().ToList(); + + var testBaseRet1 = g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + var testBaseRet2 = g.sqlite.Insert(new TestAddEnum { Type = TestAddEnumType.中国人 }).ExecuteAffrows(); + var testBaseRet3 = g.sqlite.Insert(new TestAddEnum { Type = TestAddEnumType.日本人 }).ExecuteAffrows(); + var testBaseRet4 = g.sqlite.Select().ToList(); + var testBaseRet5 = g.sqlite.Update(testBaseRet4[0]).Set(a => a.Type == TestAddEnumType.日本人).ExecuteAffrows(); + var testBaseRet6 = g.sqlite.Select().ToList(); + var testBaseRet7 = g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + var testBaseRet8 = g.sqlite.Select().ToList(); + //g.mysql.Aop.AuditValue += (_, e) => //{ diff --git a/FreeSql/DataAnnotations/TableFluent.cs b/FreeSql/DataAnnotations/TableFluent.cs index 633462b9..e2b199d5 100644 --- a/FreeSql/DataAnnotations/TableFluent.cs +++ b/FreeSql/DataAnnotations/TableFluent.cs @@ -12,7 +12,7 @@ namespace FreeSql.DataAnnotations public TableFluent(Type entityType, TableAttribute table) { _entityType = entityType; - _properties = _entityType.GetProperties().ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase); + _properties = _entityType.GetPropertiesDictIgnoreCase(); _table = table; } diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 1d935c43..f6d27fac 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -43,6 +43,19 @@ public static partial class FreeSqlGlobalExtensions public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GetGenericArguments().First() : that; internal static string NotNullAndConcat(this string that, params object[] args) => string.IsNullOrEmpty(that) ? null : string.Concat(new object[] { that }.Concat(args)); + static ConcurrentDictionary> _dicGetPropertiesDictIgnoreCase = new ConcurrentDictionary>(); + public static Dictionary GetPropertiesDictIgnoreCase(this Type that) => that == null ? null : _dicGetPropertiesDictIgnoreCase.GetOrAdd(that, tp => + { + var props = that.GetProperties(); + var dict = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var prop in props) + { + if (dict.ContainsKey(prop.Name)) continue; + dict.Add(prop.Name, prop); + } + return dict; + }); + /// /// 测量两个经纬度的距离,返回单位:米 /// diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index f27ab45e..11cf1b65 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -23,7 +23,6 @@ namespace FreeSql.Internal _common = common; } - static ConcurrentDictionary _dicReadAnonymousFieldDtoPropertys = new ConcurrentDictionary(); public bool ReadAnonymousField(List _tables, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Func getSelectGroupingMapString, List whereCascadeExpression) { Func getTSC = () => new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }; @@ -110,7 +109,7 @@ namespace FreeSql.Internal parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties; //dto 映射 - var dtoProps = _dicReadAnonymousFieldDtoPropertys.GetOrAdd(initExp.NewExpression.Type, dtoType => dtoType.GetProperties()); + var dtoProps = initExp.NewExpression.Type.GetPropertiesDictIgnoreCase().Values; foreach (var dtoProp in dtoProps) { foreach (var dtTb in _tables) @@ -180,7 +179,7 @@ namespace FreeSql.Internal { //dto 映射 parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties; - var dtoProps2 = _dicReadAnonymousFieldDtoPropertys.GetOrAdd(newExp.Type, dtoType => dtoType.GetProperties()); + var dtoProps2 = newExp.Type.GetPropertiesDictIgnoreCase().Values; foreach (var dtoProp in dtoProps2) { foreach (var dtTb in _tables) diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 1ab01b5d..a8048150 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -79,11 +79,10 @@ namespace FreeSql.Internal.CommonProvider if (isThrowException) throw e; } - internal static ConcurrentDictionary> dicQueryTypeGetProperties = new ConcurrentDictionary>(); internal Dictionary GetQueryTypeProperties(Type type) { var tb = _util.GetTableByEntity(type); - var props = tb?.Properties ?? dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties().ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase)); + var props = tb?.Properties ?? type.GetPropertiesDictIgnoreCase(); return props; } public List Query(string cmdText, object parms = null) => Query(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index cdfe4a34..226d9c05 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -262,7 +262,7 @@ namespace FreeSql.Internal else { var sb = new StringBuilder(); - var ps = type.GetProperties(); + var ps = type.GetPropertiesDictIgnoreCase().Values; var psidx = 0; foreach (var p in ps) { @@ -360,7 +360,7 @@ namespace FreeSql.Internal } var xmlNav = xpath.CreateNavigator(); - var props = type.GetProperties(); + var props = type.GetPropertiesDictIgnoreCase().Values; foreach (var prop in props) { var className = (prop.DeclaringType.IsNested ? $"{prop.DeclaringType.Namespace}.{prop.DeclaringType.DeclaringType.Name}.{prop.DeclaringType.Name}" : $"{prop.DeclaringType.Namespace}.{prop.DeclaringType.Name}").Trim('.'); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index ec6b39ef..0e955ff1 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -51,7 +51,7 @@ namespace FreeSql.Internal var tbattr = common.GetEntityTableAttribute(entity); trytb = new TableInfo(); trytb.Type = entity; - trytb.Properties = entity.GetProperties().ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase); + trytb.Properties = entity.GetPropertiesDictIgnoreCase(); trytb.CsName = entity.Name; trytb.DbName = (tbattr?.Name ?? entity.Name); trytb.DbOldName = tbattr?.OldName; @@ -72,7 +72,7 @@ namespace FreeSql.Internal var columnsList = new List(); foreach (var p in trytb.Properties.Values) { - var setMethod = trytb.Type.GetMethod($"set_{p.Name}"); + var setMethod = p.GetSetMethod(); //trytb.Type.GetMethod($"set_{p.Name}"); var colattr = common.GetEntityColumnAttribute(entity, p); var tp = common.CodeFirst.GetDbInfo(colattr?.MapType ?? p.PropertyType); if (setMethod == null || (tp == null && p.PropertyType.IsValueType)) // 属性没有 set自动忽略 @@ -391,7 +391,7 @@ namespace FreeSql.Internal { if (midType != null) { - var midTypeProps = midType.GetProperties(); + var midTypeProps = midType.GetPropertiesDictIgnoreCase().Values; var midTypePropsTrytb = midTypeProps.Where(a => a.PropertyType == trytb.Type).Count(); var midTypePropsTbref = midTypeProps.Where(a => a.PropertyType == tbref.Type).Count(); if (midTypePropsTrytb != 1 || midTypePropsTbref != 1) midType = null; @@ -1024,7 +1024,7 @@ namespace FreeSql.Internal var type = obj.GetType(); if (type == ttype) return new[] { (T)Convert.ChangeType(obj, type) }; var ret = new List(); - var ps = type.GetProperties(); + var ps = type.GetPropertiesDictIgnoreCase().Values; foreach (var p in ps) { if (string.IsNullOrEmpty(paramPrefix) == false && sql.IndexOf($"{paramPrefix}{p.Name}", StringComparison.CurrentCultureIgnoreCase) == -1) continue; @@ -1346,7 +1346,7 @@ namespace FreeSql.Internal Expression.Assign(readpknullExp, Expression.Constant(false)) }); - var props = type.GetProperties();//.ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase); + var props = type.GetPropertiesDictIgnoreCase().Values; var propIndex = 0; foreach (var prop in props) {