From 97ad7a34d8d9171caed9d339d15094aee87d93e9 Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Tue, 17 Jan 2023 20:20:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8C=96=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20ExpandoObject=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/Internal/UtilsTest.cs | 27 ++++++++++++++++++- FreeSql/Internal/UtilsExpressionTree.cs | 8 +++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs index f39a7b71..f0f8d824 100644 --- a/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data.Common; +using System.Dynamic; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -45,6 +46,30 @@ namespace FreeSql.Tests.Internal Assert.Equal("test", ps2[0].Value); Assert.Equal("p", ps2[0].ParameterName); Assert.Equal(typeof(SqlParameter), ps2[0].GetType()); + + + //测试匿名对象支持 + dynamic expObj = new ExpandoObject(); + expObj.p = "test"; + + Func constructorParamter = (name, type, value) => + { + if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); + var ret = new SqlParameter { ParameterName = $"@{name}", Value = value }; + return ret; + }; + + var ps3 = FreeSql.Internal.Utils. + GetDbParamtersByObject("select @p", + expObj, + "@", + constructorParamter); + Assert.Single(ps3); + Assert.Equal("test", ps3[0].Value); + Assert.Equal("p", ps3[0].ParameterName); + Assert.Equal(typeof(SqlParameter), ps3[0].GetType()); + + } [Fact] @@ -52,7 +77,7 @@ namespace FreeSql.Tests.Internal { var dict = new Dictionary(); string sql1 = "", sql2 = "", sql3 = ""; - + sql2 = FreeSql.Internal.Utils.ReplaceSqlConstString(sql1 = @"UPDATE ""as_table_log_202201"" SET ""msg"" = 'msg01', ""createtime"" = '2022-01-01 13:00:11' WHERE (""id"" = '6252a2e6-5df3-bb10-00c1-bda60c4053fe')", dict); Assert.Equal(3, dict.Count); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 2bd827ff..45969480 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -91,7 +91,7 @@ namespace FreeSql.Internal else colattr.IsIgnore = true; //Navigate 错误提示 var pnvAttr = common.GetEntityNavigateAttribute(trytb.Type, p); - if (pnvAttr != null) throw new Exception(CoreStrings.Navigation_Missing_SetProperty(trytb.Type.DisplayCsharp(),p.Name)); + if (pnvAttr != null) throw new Exception(CoreStrings.Navigation_Missing_SetProperty(trytb.Type.DisplayCsharp(), p.Name)); } if (tp == null && colattr?.IsIgnore != true) { @@ -396,7 +396,7 @@ namespace FreeSql.Internal trytb.VersionColumn = trytb.Columns.Values.Where(a => a.Attribute.IsVersion == true).LastOrDefault(); if (trytb.VersionColumn != null) { - if (trytb.VersionColumn.Attribute.MapType.IsNullableType() || + if (trytb.VersionColumn.Attribute.MapType.IsNullableType() || trytb.VersionColumn.Attribute.MapType.IsNumberType() == false && !new[] { typeof(byte[]), typeof(string) }.Contains(trytb.VersionColumn.Attribute.MapType)) throw new Exception(CoreStrings.Properties_AsRowLock_Must_Numeric_Byte(trytb.VersionColumn.CsName)); } @@ -1061,7 +1061,7 @@ namespace FreeSql.Internal trytb.AddOrUpdateTableRef(pnv.Name, nvref); } } - + if (nvref.Exception == null && trytb.Primarys.Length == 1 && isArrayToMany == false) { if (pnvBind?.Length == 1) @@ -1431,7 +1431,7 @@ namespace FreeSql.Internal var type = obj.GetType(); if (ttype.IsAssignableFrom(type)) return new[] { (T)obj }; var ret = new List(); - var dic = obj as IDictionary; + var dic = obj as IDictionary; if (dic != null) { foreach (var key in dic.Keys)