diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs new file mode 100644 index 00000000..250bae5c --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Internal/UtilsTest.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Xunit; + +namespace FreeSql.Tests.Internal +{ + + public class UtilsTest + { + [Fact] + public void TestGetDbParamtersByObject() + { + var ps = FreeSql.Internal.Utils. + GetDbParamtersByObject("select @p", + new { p = (DbParameter)new SqlParameter() { ParameterName = "p", Value = "test" } }, + "@", + (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; + }); + Assert.Single(ps); + Assert.Equal("test", ps[0].Value); + Assert.Equal("p", ps[0].ParameterName); + Assert.Equal(typeof(SqlParameter), ps[0].GetType()); + + + var ps2 = FreeSql.Internal.Utils. + GetDbParamtersByObject("select @p", + new Dictionary { { "p", (DbParameter)new SqlParameter() { ParameterName = "p", Value = "test" } } }, + "@", + (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; + }); + Assert.Single(ps2); + Assert.Equal("test", ps2[0].Value); + Assert.Equal("p", ps2[0].ParameterName); + Assert.Equal(typeof(SqlParameter), ps2[0].GetType()); + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index 63226af1..c5fc53c0 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -24,7 +24,7 @@ namespace FreeSql.Tests { public static T TryTo(this string that) { - return (T)Internal.Utils.GetDataReaderValue(typeof(T), that); + return (T)FreeSql.Internal.Utils.GetDataReaderValue(typeof(T), that); } public static string FormatDateTime() @@ -311,7 +311,7 @@ namespace FreeSql.Tests public TaskBuild Parent { get; set; } } - + void parseExp(object sender, Aop.ParseExpressionEventArgs e) { @@ -323,7 +323,7 @@ namespace FreeSql.Tests if (callExp.Method.Name == "TryTo") { e.Result = Expression.Lambda( - typeof(Func<>).MakeGenericType(callExp.Method.GetGenericArguments().FirstOrDefault()), + typeof(Func<>).MakeGenericType(callExp.Method.GetGenericArguments().FirstOrDefault()), e.Expression).Compile().DynamicInvoke()?.ToString(); return; } @@ -464,10 +464,11 @@ namespace FreeSql.Tests emoji = g.sqlserver.Select().Where(a => a.Id == testemoji.Id).First(); Assert.Equal("💐🌸💮🌹🌺🌻🌼🌷🌱🌿🍀", emoji.xxx); - var _model = new TestUpdateModel { - F_EmpId = "xx11", - F_RoleType = TestUpdateModelEnum.x2, - F_UseType = TestUpdateModelEnum.x3 + var _model = new TestUpdateModel + { + F_EmpId = "xx11", + F_RoleType = TestUpdateModelEnum.x2, + F_UseType = TestUpdateModelEnum.x3 }; var testsql2008 = g.sqlserver.Update() .Where(a => a.F_EmpId == _model.F_EmpId) @@ -578,7 +579,7 @@ namespace FreeSql.Tests var gkjdjd = g.sqlite.Select().Where(a => a.Post.AsSelect().Count() > 0).ToList(); - var testrunsql1 = g.mysql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testrunsql1 = g.mysql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); var testrunsql2 = g.pgsql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); var testrunsql3 = g.sqlserver.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); var testrunsql4 = g.oracle.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); @@ -600,18 +601,18 @@ namespace FreeSql.Tests IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=7") - .UseNameConvert(Internal.NameConvertType.PascalCaseToUnderscoreWithLower) + .UseNameConvert(FreeSql.Internal.NameConvertType.PascalCaseToUnderscoreWithLower) .UseNoneCommandParameter(true) .UseAutoSyncStructure(true) //自动同步实体结构到数据库 .UseMonitorCommand(a => Trace.WriteLine(a.CommandText)) .Build(); var data = fsql.Select().ToList(r => new - { - Id = r.Id, - Name = r.AuthorId.ToString(), - AuthorName = r.Author.Name, - }); + { + Id = r.Id, + Name = r.AuthorId.ToString(), + AuthorName = r.Author.Name, + }); //g.mysql.Aop.AuditValue += (s, e) => //{ @@ -636,8 +637,8 @@ namespace FreeSql.Tests .Include(a => a.MedicalRecord) .ToSql(); - var dkdkd = g.mysql.Select().AsTable((t,old) => "TaskBuild22") - .ToList< TestDto>(a => new TestDto() + var dkdkd = g.mysql.Select().AsTable((t, old) => "TaskBuild22") + .ToList(a => new TestDto() { Id = a.Id, IsLeaf = g.mysql.Select().AsTable((t, old) => "TaskBuild22").Any(b => b.TemplatesId == a.Id) @@ -645,13 +646,13 @@ namespace FreeSql.Tests var xxxkdkd = g.oracle.Select() - .InnerJoin((a,b) => true) - .Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100) - .OrderBy((a,b) => g.oracle.Select().Where(c => b.Id == c.Id2).Count()) + .InnerJoin((a, b) => true) + .Where((a, b) => (DateTime.Now - a.EditTime).TotalMinutes > 100) + .OrderBy((a, b) => g.oracle.Select().Where(c => b.Id == c.Id2).Count()) .ToSql(); - - g.oracle.Aop.SyncStructureAfter += (s, e) => + + g.oracle.Aop.SyncStructureAfter += (s, e) => Trace.WriteLine(e.Sql); g.oracle.CodeFirst.SyncStructure(); @@ -729,7 +730,7 @@ namespace FreeSql.Tests .ToSql(a => new NewsArticleDto { ArticleTitle = a.Key, - ChannelId = (int)a.Sum(a.Value.Item1.OptionsEntity04) + ChannelId = (int)a.Sum(a.Value.Item1.OptionsEntity04) }); var testgrpsql2 = g.sqlite.Select() @@ -1004,7 +1005,7 @@ namespace FreeSql.Tests cou = b.Count(), sum = b.Sum(b.Key.yyyy), sum2 = b.Sum(b.Value.TypeGuid) - }); + }); var aggtolist22 = select .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) }) .ToDictionaryAsync(b => new diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index a4b43ca4..c0b0422f 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Data; using System.Data.Common; using System.Linq; using System.Linq.Expressions; @@ -118,7 +119,7 @@ namespace FreeSql.Internal var leftBt = colattr.DbType.IndexOf('('); colattr.DbType = colattr.DbType.Substring(0, leftBt).ToUpper() + colattr.DbType.Substring(leftBt); } - else if(common._orm.Ado.DataType != DataType.ClickHouse) + else if (common._orm.Ado.DataType != DataType.ClickHouse) colattr.DbType = colattr.DbType.ToUpper(); if (colattrIsNull == false && colattrIsNullable == true) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); @@ -135,7 +136,7 @@ namespace FreeSql.Internal colattr.DbType = Regex.Replace(colattr.DbType, @"\bNULL\b", "").Trim() + " NOT NULL"; } if (colattr.IsNullable == true && colattr.DbType.Contains("NOT NULL")) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); - else if (colattr.IsNullable == true && !colattr.DbType.Contains("Nullable") && common._orm.Ado.DataType == DataType.ClickHouse)colattr.DbType = $"Nullable({colattr.DbType})" ; + else if (colattr.IsNullable == true && !colattr.DbType.Contains("Nullable") && common._orm.Ado.DataType == DataType.ClickHouse) colattr.DbType = $"Nullable({colattr.DbType})"; colattr.DbType = Regex.Replace(colattr.DbType, @"\([^\)]+\)", m => { var tmpLt = Regex.Replace(m.Groups[0].Value, @"\s", ""); @@ -1272,12 +1273,13 @@ namespace FreeSql.Internal }); public static T[] GetDbParamtersByObject(string sql, object obj, string paramPrefix, Func constructorParamter) + where T : IDataParameter { if (string.IsNullOrEmpty(sql) || obj == null) return new T[0]; var isCheckSql = sql != "*"; var ttype = typeof(T); var type = obj.GetType(); - if (type == ttype) return new[] { (T)Convert.ChangeType(obj, type) }; + if (ttype.IsAssignableFrom(type)) return new[] { (T)obj }; var ret = new List(); var dic = obj as IDictionary; if (dic != null) @@ -1288,7 +1290,7 @@ namespace FreeSql.Internal if (isCheckSql && string.IsNullOrEmpty(paramPrefix) == false && sql.IndexOf($"{paramPrefix}{dbkey}", StringComparison.CurrentCultureIgnoreCase) == -1) continue; var val = dic[key]; var valType = val == null ? typeof(string) : val.GetType(); - if (valType == ttype) ret.Add((T)Convert.ChangeType(val, ttype)); + if (ttype.IsAssignableFrom(valType)) ret.Add((T)val); else ret.Add(constructorParamter(dbkey, valType, val)); } } @@ -1299,7 +1301,7 @@ namespace FreeSql.Internal { if (isCheckSql && string.IsNullOrEmpty(paramPrefix) == false && sql.IndexOf($"{paramPrefix}{p.Name}", StringComparison.CurrentCultureIgnoreCase) == -1) continue; var pvalue = p.GetValue(obj, null); - if (p.PropertyType == ttype) ret.Add((T)Convert.ChangeType(pvalue, ttype)); + if (ttype.IsAssignableFrom(p.PropertyType)) ret.Add((T)pvalue); else ret.Add(constructorParamter(p.Name, p.PropertyType, pvalue)); } } @@ -1371,7 +1373,7 @@ namespace FreeSql.Internal this.Value = value; this.DataIndex = dataIndex; } - public static ConstructorInfo Constructor = typeof(RowInfo). GetConstructor(new[] { typeof(object), typeof(int) }); + public static ConstructorInfo Constructor = typeof(RowInfo).GetConstructor(new[] { typeof(object), typeof(int) }); public static PropertyInfo PropertyValue = typeof(RowInfo).GetProperty("Value"); public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex"); } @@ -1851,7 +1853,7 @@ namespace FreeSql.Internal static MethodInfo MethodBigIntegerParse = typeof(Utils).GetMethod("ToBigInteger", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(string) }, null); static PropertyInfo PropertyDateTimeOffsetDateTime = typeof(DateTimeOffset).GetProperty("DateTime", BindingFlags.Instance | BindingFlags.Public); static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public); - static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset). GetConstructor(new[] { typeof(long), typeof(TimeSpan) }); + static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset).GetConstructor(new[] { typeof(long), typeof(TimeSpan) }); static Encoding DefaultEncoding = Encoding.UTF8; static MethodInfo MethodEncodingGetBytes = typeof(Encoding).GetMethod("GetBytes", new[] { typeof(string) }); static MethodInfo MethodEncodingGetString = typeof(Encoding).GetMethod("GetString", new[] { typeof(byte[]) }); @@ -1870,7 +1872,7 @@ namespace FreeSql.Internal { if (type.IsArray) { - switch (type.FullName) + switch (type.FullName) { case "System.Byte[]": return Expression.IfThenElse(