diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index b419f4dd..6db4cd6b 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -312,6 +312,11 @@ namespace base_entity { public DateTime Date { get; set; } } + record TestClass(string Name) + { + public Guid Id { get; set; } + public string[] Tags { get; init; } = Array.Empty(); + } static void Main(string[] args) { #region 初始化 IFreeSql @@ -361,6 +366,23 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + + fsql.UseJsonMap(); + + fsql.CodeFirst.ConfigEntity(cf => + { + cf.Property(p => p.Name).IsNullable(false); + cf.Property(p => p.Tags).JsonMap(); + }); + + fsql.Insert(new TestClass("test 1") + { + Tags = new[] { "a", "b" }, + }) + .ExecuteAffrows(); + var records = fsql.Queryable().ToList(); + + InitData(); InitData(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 2bd827ff..840a8086 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -2018,9 +2018,9 @@ namespace FreeSql.Internal { var returnTarget = Expression.Label(typeof(object)); var valueExp = Expression.Variable(typeof(object), "locvalue"); - Func funcGetExpression = () => + Expression LocalFuncGetExpression(bool ignoreArray = false) { - if (type.IsArray) + if (!ignoreArray && type.IsArray) { switch (type.FullName) { @@ -2059,33 +2059,37 @@ namespace FreeSql.Internal return Expression.IfThenElse( Expression.TypeEqual(valueExp, type), Expression.Return(returnTarget, valueExp), - Expression.Block( - new[] { arrNewExp, arrExp, arrLenExp, arrXExp, arrReadValExp }, - Expression.Assign(arrExp, Expression.TypeAs(valueExp, typeof(Array))), - Expression.IfThenElse( - Expression.Equal(arrExp, Expression.Constant(null)), - Expression.Assign(arrLenExp, Expression.Constant(0)), - Expression.Assign(arrLenExp, Expression.Call(arrExp, MethodArrayGetLength, Expression.Constant(0))) - ), - Expression.Assign(arrXExp, Expression.Constant(0)), - Expression.Assign(arrNewExp, Expression.NewArrayBounds(elementType, arrLenExp)), - Expression.Loop( + Expression.IfThenElse( + Expression.TypeEqual(valueExp, typeof(string)), //JSON + LocalFuncGetExpression(true), + Expression.Block( + new[] { arrNewExp, arrExp, arrLenExp, arrXExp, arrReadValExp }, + Expression.Assign(arrExp, Expression.TypeAs(valueExp, typeof(Array))), Expression.IfThenElse( - Expression.LessThan(arrXExp, arrLenExp), - Expression.Block( - Expression.Assign(arrReadValExp, GetDataReaderValueBlockExpression(elementType, Expression.Call(arrExp, MethodArrayGetValue, arrXExp))), - Expression.IfThenElse( - Expression.Equal(arrReadValExp, Expression.Constant(null)), - Expression.Assign(Expression.ArrayAccess(arrNewExp, arrXExp), Expression.Default(elementType)), - Expression.Assign(Expression.ArrayAccess(arrNewExp, arrXExp), Expression.Convert(arrReadValExp, elementType)) - ), - Expression.PostIncrementAssign(arrXExp) - ), - Expression.Break(label, arrXExp) + Expression.Equal(arrExp, Expression.Constant(null)), + Expression.Assign(arrLenExp, Expression.Constant(0)), + Expression.Assign(arrLenExp, Expression.Call(arrExp, MethodArrayGetLength, Expression.Constant(0))) ), - label - ), - Expression.Return(returnTarget, arrNewExp) + Expression.Assign(arrXExp, Expression.Constant(0)), + Expression.Assign(arrNewExp, Expression.NewArrayBounds(elementType, arrLenExp)), + Expression.Loop( + Expression.IfThenElse( + Expression.LessThan(arrXExp, arrLenExp), + Expression.Block( + Expression.Assign(arrReadValExp, GetDataReaderValueBlockExpression(elementType, Expression.Call(arrExp, MethodArrayGetValue, arrXExp))), + Expression.IfThenElse( + Expression.Equal(arrReadValExp, Expression.Constant(null)), + Expression.Assign(Expression.ArrayAccess(arrNewExp, arrXExp), Expression.Default(elementType)), + Expression.Assign(Expression.ArrayAccess(arrNewExp, arrXExp), Expression.Convert(arrReadValExp, elementType)) + ), + Expression.PostIncrementAssign(arrXExp) + ), + Expression.Break(label, arrXExp) + ), + label + ), + Expression.Return(returnTarget, arrNewExp) + ) ) ); } @@ -2387,7 +2391,7 @@ namespace FreeSql.Internal Expression.Equal(valueExp, Expression.Constant(DBNull.Value)) ), Expression.Return(returnTarget, Expression.Convert(Expression.Default(type), typeof(object))), - funcGetExpression() + LocalFuncGetExpression() ), Expression.Label(returnTarget, Expression.Default(typeof(object))) );