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)
{