mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- fix string[] UseJsonMap bug;#653
This commit is contained in:
		@@ -312,6 +312,11 @@ namespace base_entity
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            public DateTime Date { get; set; }
 | 
					            public DateTime Date { get; set; }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        record TestClass(string Name)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid Id { get; set; }
 | 
				
			||||||
 | 
					            public string[] Tags { get; init; } = Array.Empty<string>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        static void Main(string[] args)
 | 
					        static void Main(string[] args)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            #region 初始化 IFreeSql
 | 
					            #region 初始化 IFreeSql
 | 
				
			||||||
@@ -361,6 +366,23 @@ namespace base_entity
 | 
				
			|||||||
            BaseEntity.Initialization(fsql, () => _asyncUow.Value);
 | 
					            BaseEntity.Initialization(fsql, () => _asyncUow.Value);
 | 
				
			||||||
            #endregion
 | 
					            #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fsql.UseJsonMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fsql.CodeFirst.ConfigEntity<TestClass>(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<TestClass>().ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            InitData();
 | 
					            InitData();
 | 
				
			||||||
            InitData();
 | 
					            InitData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -800,5 +800,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2018,9 +2018,9 @@ namespace FreeSql.Internal
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            var returnTarget = Expression.Label(typeof(object));
 | 
					            var returnTarget = Expression.Label(typeof(object));
 | 
				
			||||||
            var valueExp = Expression.Variable(typeof(object), "locvalue");
 | 
					            var valueExp = Expression.Variable(typeof(object), "locvalue");
 | 
				
			||||||
            Func<Expression> funcGetExpression = () =>
 | 
					            Expression LocalFuncGetExpression(bool ignoreArray = false)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (type.IsArray)
 | 
					                if (!ignoreArray && type.IsArray)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    switch (type.FullName)
 | 
					                    switch (type.FullName)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
@@ -2059,33 +2059,37 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    return Expression.IfThenElse(
 | 
					                    return Expression.IfThenElse(
 | 
				
			||||||
                        Expression.TypeEqual(valueExp, type),
 | 
					                        Expression.TypeEqual(valueExp, type),
 | 
				
			||||||
                        Expression.Return(returnTarget, valueExp),
 | 
					                        Expression.Return(returnTarget, valueExp),
 | 
				
			||||||
                        Expression.Block(
 | 
					                        Expression.IfThenElse(
 | 
				
			||||||
                            new[] { arrNewExp, arrExp, arrLenExp, arrXExp, arrReadValExp },
 | 
					                            Expression.TypeEqual(valueExp, typeof(string)), //JSON
 | 
				
			||||||
                            Expression.Assign(arrExp, Expression.TypeAs(valueExp, typeof(Array))),
 | 
					                            LocalFuncGetExpression(true),
 | 
				
			||||||
                            Expression.IfThenElse(
 | 
					                            Expression.Block(
 | 
				
			||||||
                                Expression.Equal(arrExp, Expression.Constant(null)),
 | 
					                                new[] { arrNewExp, arrExp, arrLenExp, arrXExp, arrReadValExp },
 | 
				
			||||||
                                Expression.Assign(arrLenExp, Expression.Constant(0)),
 | 
					                                Expression.Assign(arrExp, Expression.TypeAs(valueExp, typeof(Array))),
 | 
				
			||||||
                                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.IfThenElse(
 | 
				
			||||||
                                    Expression.LessThan(arrXExp, arrLenExp),
 | 
					                                    Expression.Equal(arrExp, Expression.Constant(null)),
 | 
				
			||||||
                                    Expression.Block(
 | 
					                                    Expression.Assign(arrLenExp, Expression.Constant(0)),
 | 
				
			||||||
                                        Expression.Assign(arrReadValExp, GetDataReaderValueBlockExpression(elementType, Expression.Call(arrExp, MethodArrayGetValue, arrXExp))),
 | 
					                                    Expression.Assign(arrLenExp, Expression.Call(arrExp, MethodArrayGetLength, Expression.Constant(0)))
 | 
				
			||||||
                                        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.Assign(arrXExp, Expression.Constant(0)),
 | 
				
			||||||
                            ),
 | 
					                                Expression.Assign(arrNewExp, Expression.NewArrayBounds(elementType, arrLenExp)),
 | 
				
			||||||
                            Expression.Return(returnTarget, arrNewExp)
 | 
					                                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.Equal(valueExp, Expression.Constant(DBNull.Value))
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                    Expression.Return(returnTarget, Expression.Convert(Expression.Default(type), typeof(object))),
 | 
					                    Expression.Return(returnTarget, Expression.Convert(Expression.Default(type), typeof(object))),
 | 
				
			||||||
                    funcGetExpression()
 | 
					                    LocalFuncGetExpression()
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                Expression.Label(returnTarget, Expression.Default(typeof(object)))
 | 
					                Expression.Label(returnTarget, Expression.Default(typeof(object)))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user