From 66e6f3908695b750d305a9fea54426ff886a3aee Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 2 Aug 2022 13:45:05 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20Oracle=20IN=20:ids=20?= =?UTF-8?q?=E5=80=BC=E4=BC=A0=E5=85=A5=20IList=20=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E9=94=99=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 113 +++++++++--------- FreeSql.DbContext/FreeSql.DbContext.xml | 18 --- .../Oracle/OracleAdo/OracleAdoTest.cs | 4 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 28 ++++- 4 files changed, 88 insertions(+), 75 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 41cfdcbd..f8f8ef92 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -753,62 +753,65 @@ namespace base_entity }).Where(a => a.ConcurrentDictionarys.Length > 0).ToArray(); #region pgsql poco - // fsql.Aop.ParseExpression += (_, e) => + //fsql.Aop.ParseExpression += (_, e) => + //{ + // //解析 POCO Jsonb a.Customer.Name + // if (e.Expression is MemberExpression memExp) + // { + // var parentMemExps = new Stack(); + // parentMemExps.Push(memExp); + // while (true) + // { + // switch (memExp.Expression.NodeType) // { - // //解析 POCO Jsonb a.Customer.Name - // if (e.Expression is MemberExpression memExp) - // { - // var parentMemExps = new Stack(); + // case ExpressionType.MemberAccess: + // memExp = memExp.Expression as MemberExpression; + // if (memExp == null) return; // parentMemExps.Push(memExp); - // while (true) + // break; + // case ExpressionType.Parameter: + // var tb = fsql.CodeFirst.GetTableByEntity(memExp.Expression.Type); + // if (tb == null) return; + // if (tb.ColumnsByCs.TryGetValue(parentMemExps.Pop().Member.Name, out var trycol) == false) return; + // if (new[] { typeof(JToken), typeof(JObject), typeof(JArray) }.Contains(trycol.Attribute.MapType.NullableTypeOrThis()) == false) return; + // var tmpcol = tb.ColumnsByPosition.OrderBy(a => a.Attribute.Name.Length).First(); + // var result = e.FreeParse(Expression.MakeMemberAccess(memExp.Expression, tb.Properties[tmpcol.CsName])); + // result = result.Replace(tmpcol.Attribute.Name, trycol.Attribute.Name); + // while (parentMemExps.Any()) // { - // switch (memExp.Expression.NodeType) - // { - // case ExpressionType.MemberAccess: - // memExp = memExp.Expression as MemberExpression; - // if (memExp == null) return; - // parentMemExps.Push(memExp); - // break; - // case ExpressionType.Parameter: - // var tb = fsql.CodeFirst.GetTableByEntity(memExp.Expression.Type); - // if (tb == null) return; - // if (tb.ColumnsByCs.TryGetValue(parentMemExps.Pop().Member.Name, out var trycol) == false) return; - // if (new[] { typeof(JToken), typeof(JObject), typeof(JArray) }.Contains(trycol.Attribute.MapType.NullableTypeOrThis()) == false) return; - // var tmpcol = tb.ColumnsByPosition.OrderBy(a => a.Attribute.Name.Length).First(); - // var result = e.FreeParse(Expression.MakeMemberAccess(memExp.Expression, tb.Properties[tmpcol.CsName])); - // result = result.Replace(tmpcol.Attribute.Name, trycol.Attribute.Name); - // while (parentMemExps.Any()) - // { - // memExp = parentMemExps.Pop(); - // result = $"{result}->>'{memExp.Member.Name}'"; - // } - // e.Result = result; - // return; - // } + // memExp = parentMemExps.Pop(); + // result = $"{result}->>'{memExp.Member.Name}'"; // } - // } - // }; + // e.Result = result; + // return; + // } + // } + // } + //}; - // var methodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); - // var methodJsonConvertSerializeObject = typeof(JsonConvert).GetMethod("SerializeObject", new[] { typeof(object), typeof(JsonSerializerSettings) }); - // var jsonConvertSettings = JsonConvert.DefaultSettings?.Invoke() ?? new JsonSerializerSettings(); - // FreeSql.Internal.Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Customer)] = true; - // FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionObjectToStringIfThenElse.Add((LabelTarget returnTarget, Expression valueExp, Expression elseExp, Type type) => - // { - // return Expression.IfThenElse( - // Expression.TypeIs(valueExp, typeof(Customer)), - // Expression.Return(returnTarget, Expression.Call(methodJsonConvertSerializeObject, Expression.Convert(valueExp, typeof(object)), Expression.Constant(jsonConvertSettings)), typeof(object)), - // elseExp); - // }); - // FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => - // { - // if (type == typeof(Customer)) return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(methodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type)), type)); - // return null; - // }); + //void RegisterPocoType(Type pocoType) + //{ + // var methodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + // var methodJsonConvertSerializeObject = typeof(JsonConvert).GetMethod("SerializeObject", new[] { typeof(object), typeof(JsonSerializerSettings) }); + // var jsonConvertSettings = JsonConvert.DefaultSettings?.Invoke() ?? new JsonSerializerSettings(); + // FreeSql.Internal.Utils.dicExecuteArrayRowReadClassOrTuple[pocoType] = true; + // FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionObjectToStringIfThenElse.Add((LabelTarget returnTarget, Expression valueExp, Expression elseExp, Type type) => + // { + // return Expression.IfThenElse( + // Expression.TypeIs(valueExp, pocoType), + // Expression.Return(returnTarget, Expression.Call(methodJsonConvertSerializeObject, Expression.Convert(valueExp, typeof(object)), Expression.Constant(jsonConvertSettings)), typeof(object)), + // elseExp); + // }); + // FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => + // { + // if (type == pocoType) return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(methodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type)), type)); + // return null; + // }); + //} - // var seid = fsql.Insert(new SomeEntity - // { - // Customer = JsonConvert.DeserializeObject(@"{ + //var seid = fsql.Insert(new SomeEntity + //{ + // Customer = JsonConvert.DeserializeObject(@"{ // ""Age"": 25, // ""Name"": ""Joe"", // ""Orders"": [ @@ -816,12 +819,12 @@ namespace base_entity // { ""OrderPrice"": 23, ""ShippingAddress"": ""Some address 2"" } // ] //}") - // }).ExecuteIdentity(); - // var selist = fsql.Select().ToList(); + //}).ExecuteIdentity(); + //var selist = fsql.Select().ToList(); - // var joes = fsql.Select() - // .Where(e => e.Customer.Name == "Joe") - // .ToSql(); + //var joes = fsql.Select() + // .Where(e => e.Customer.Name == "Joe") + // .ToSql(); #endregion var testitems = new[] diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 @@ -800,14 +791,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs index 8997a6b5..f0401716 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleAdo/OracleAdoTest.cs @@ -1,5 +1,6 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; +using System.Collections.Generic; using Xunit; namespace FreeSql.Tests.Oracle @@ -55,6 +56,7 @@ namespace FreeSql.Tests.Oracle var t5 = g.oracle.Ado.Query("select * from \"TB_TOPIC\""); var t6 = g.oracle.Ado.Query("select * from TB_TOPIC where id in :ids", new { ids = new[] { 1, 2, 3 } }); + var t7 = g.oracle.Ado.Query("select * from TB_TOPIC where id in :ids", new { ids = new List(new[] { 1, 2, 3 }) }); } [Fact] diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 53cccbe9..5fc1d27f 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -2,6 +2,7 @@ using FreeSql.Internal.Model; using Oracle.ManagedDataAccess.Client; using System; +using System.Collections; using System.Collections.Generic; using System.Data.Common; using System.Globalization; @@ -69,7 +70,32 @@ namespace FreeSql.Oracle } var ret = new OracleParameter { ParameterName = $":{name}" }; if (dbtype != null) ret.OracleDbType = dbtype.Value; - ret.Value = value; + if (value is IList valueList && value is Array == false && valueList.Count > 0) + { + var valueItemType = valueList[0]?.GetType(); + if (valueItemType == typeof(int)) LocalSetListValue(); + else if (valueItemType == typeof(long)) LocalSetListValue(); + else if (valueItemType == typeof(short)) LocalSetListValue(); + else if (valueItemType == typeof(string)) LocalSetListValue(); + else if(valueItemType == typeof(Guid)) LocalSetListValue(); + else if (valueItemType == typeof(char)) LocalSetListValue(); + else if (valueItemType == typeof(bool)) LocalSetListValue(); + else if (valueItemType == typeof(uint)) LocalSetListValue(); + else if (valueItemType == typeof(ulong)) LocalSetListValue(); + else if (valueItemType == typeof(ushort)) LocalSetListValue(); + else if (valueItemType == typeof(decimal)) LocalSetListValue(); + else if (valueItemType == typeof(double)) LocalSetListValue(); + else if (valueItemType == typeof(float)) LocalSetListValue(); + else if (valueItemType == typeof(DateTime)) LocalSetListValue(); + + void LocalSetListValue() + { + var valueCopy = new List(); + foreach (var valueItem in valueList) valueCopy.Add((T)Utils.GetDataReaderValue(valueItemType, valueItem)); + value = valueCopy.ToArray(); + } + } + ret.Value = value; //IList 赋值会报错 return ret; });