From a5723c177396b2d541d3360c86d52d4ee20b40e5 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 29 Apr 2022 18:56:10 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20pgsql=20IList=20->=20J?= =?UTF-8?q?Array=20=E6=98=A0=E5=B0=84=EF=BC=9B#1092?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 --- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 10 +++ FreeSql.Tests/FreeSql.Tests/Issues/1092.cs | 66 +++++++++++++++++++ .../PostgreSQLProvider.cs | 7 +- 4 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Issues/1092.cs diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index bdd16ff9..da7ace6b 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -538,14 +538,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 96d17f87..4428e136 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -14,6 +14,16 @@ 编号 + + + 会员ID + + + + + 会员ID + + 收款金额 diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs new file mode 100644 index 00000000..ba5b9681 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs @@ -0,0 +1,66 @@ +using FreeSql.DataAnnotations; +using FreeSql; +using System; +using System.Collections.Generic; +using Xunit; +using System.Linq; +using Newtonsoft.Json.Linq; +using NpgsqlTypes; +using Npgsql.LegacyPostgis; +using System.Linq.Expressions; +using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; +using System.Threading; +using System.Data.SqlClient; +using kwlib; +using System.Diagnostics; +using System.IO; +using System.Text; +using Newtonsoft.Json; + +namespace FreeSql.Tests.Issues +{ + public class _1092 + { + [Fact] + public void JsonbTest() + { + var fsql = g.pgsql; + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var model = new Test() { Name = "hahahah", Ids = new List { 22 } }; + + var json1 = JsonConvert.SerializeObject(new List { 22 }); + var jarray1 = JArray.FromObject(new List { 22 }); + + //异常: + /* + * Unable to cast object of type 'Newtonsoft.Json.Linq.JArray' to type 'System.String'.” + */ + var insertAndOut = fsql.Insert(model) + .ExecuteInserted(); + + //异常,和ExecuteInserted一样的错误 + var updateResult = fsql.Update() + .SetSource(model) + .ExecuteUpdated(); + } + + [Table(Name = "public.test_issues_1092")] + public class Test + { + [Column(Name = "id", IsPrimary = true, IsIdentity = true)] + public int Id { get; set; } + /// + /// 会员ID + /// + [Column(Name = "name")] + public string Name { get; set; } + /// + /// 会员ID + /// + [Column(Name = "ids", MapType = typeof(JArray))] + public List Ids { get; set; } + } + } +} diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index 95df5ad2..3570378a 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -12,6 +12,7 @@ using System.Data.Common; using System.Linq.Expressions; using System.Net; using System.Net.NetworkInformation; +using System.Reflection; using System.Threading; namespace FreeSql.PostgreSQL @@ -70,6 +71,7 @@ namespace FreeSql.PostgreSQL var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null); Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => { switch (type.FullName) @@ -95,7 +97,10 @@ namespace FreeSql.PostgreSQL return Expression.Return(returnTarget, valueExp); } if (typeof(IList).IsAssignableFrom(type)) - return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)); + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type))); return null; }); }