From a6b2b80d442376fbbf7d0fb482f8af5f10392274 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 25 Jan 2019 23:14:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/DataAnnotations/TableAttribute.cs | 2 +- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 1 + FreeSql/Internal/CommonExpression.cs | 2 +- .../SelectProvider/Select0Provider.cs | 4 ++-- FreeSql/Internal/UtilsExpressionTree.cs | 22 +++++++++---------- FreeSql/Internal/UtilsReflection.cs | 10 ++++----- FreeSql/MySql/MySqlCodeFirst.cs | 2 +- FreeSql/MySql/MySqlExpression.cs | 8 +++---- FreeSql/Oracle/OracleCodeFirst.cs | 2 +- FreeSql/Oracle/OracleExpression.cs | 8 +++---- FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs | 2 +- FreeSql/PostgreSQL/PostgreSQLExpression.cs | 8 +++---- FreeSql/PostgreSQL/PostgreSQLUtils.cs | 4 ++-- FreeSql/SqlServer/SqlServerCodeFirst.cs | 2 +- FreeSql/SqlServer/SqlServerExpression.cs | 8 +++---- FreeSql/Sqlite/SqliteCodeFirst.cs | 2 +- FreeSql/Sqlite/SqliteExpression.cs | 8 +++---- 17 files changed, 46 insertions(+), 49 deletions(-) diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index 65afe1e5..1210d8d8 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -17,6 +17,6 @@ namespace FreeSql.DataAnnotations { /// public string SelectFilter { get; set; } - internal ConcurrentDictionary _columns = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); + internal ConcurrentDictionary _columns => new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); } } diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 907d6172..350b2109 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -26,6 +26,7 @@ public static class FreeSqlGlobalExtensions { [typeof(decimal)] = true, [typeof(decimal?)] = true }); public static bool IsNumberType(this Type that) => that == null ? false : dicIsNumberType.Value.ContainsKey(that); + public static bool IsNullableType(this Type that) => that?.FullName.StartsWith("System.Nullable`1[") == true; /// /// 测量两个经纬度的距离,返回单位:米 diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index a946ea2d..8e8f567a 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -299,7 +299,7 @@ namespace FreeSql.Internal { throw new Exception($"未现实函数表达式 {exp3} 解析"); case ExpressionType.MemberAccess: var exp4 = exp as MemberExpression; - if (exp4.Expression != null && exp4.Expression.Type.IsArray == false && exp4.Expression.Type.FullName.StartsWith("System.Nullable`1[")) return ExpressionLambdaToSql(exp4.Expression, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); + if (exp4.Expression != null && exp4.Expression.Type.IsArray == false && exp4.Expression.Type.IsNullableType()) return ExpressionLambdaToSql(exp4.Expression, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName); var extRet = ""; var memberType = exp4.Expression?.Type ?? exp4.Type; switch (memberType.FullName) { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index a4813b54..0b0ade7d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -249,7 +249,7 @@ namespace FreeSql.Internal.CommonProvider { public Func Read { get; set; } } protected GetAllFieldExpressionTreeInfo GetAllFieldExpressionTree() { - return _dicGetAllFieldExpressionTree.GetOrAdd(string.Join("+", _tables.Select(a => $"{a.Table.DbName}-{a.Alias}-{a.Type}")), s => { + return _dicGetAllFieldExpressionTree.GetOrAdd(string.Join("+", _tables.Select(a => $"{_commonUtils.DbName}-{a.Table.DbName}-{a.Alias}-{a.Type}")), s => { var tb1 = _tables.First().Table; var type = tb1.TypeLazy ?? tb1.Type; var props = tb1.Properties; @@ -313,7 +313,7 @@ namespace FreeSql.Internal.CommonProvider { ); else { var proptypeGeneric = prop.PropertyType; - if (proptypeGeneric.FullName.StartsWith("System.Nullable`1[")) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); if (proptypeGeneric.IsEnum || Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(Utils.RowInfo.Constructor, Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp)), diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index d820ab6c..95318dd7 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -85,11 +85,9 @@ namespace FreeSql.Internal { }); colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(Activator.CreateInstance(trytb.Type)); if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue; - if (colattr.IsNullable == false && colattr.DbDefautValue == null) { - var consturctorType = p.PropertyType.GenericTypeArguments.FirstOrDefault() ?? p.PropertyType; - colattr.DbDefautValue = Activator.CreateInstance(consturctorType); - } - if (colattr.IsIdentity == true && (p.PropertyType.GenericTypeArguments.FirstOrDefault() ?? p.PropertyType)?.IsNumberType() == false) + if (colattr.IsNullable == false && colattr.DbDefautValue == null) + colattr.DbDefautValue = Activator.CreateInstance(p.PropertyType.IsNullableType() ? p.PropertyType.GenericTypeArguments.FirstOrDefault() : p.PropertyType); + if (colattr.IsIdentity == true && p.PropertyType.IsNumberType() == false) colattr.IsIdentity = false; var col = new ColumnInfo { @@ -538,7 +536,7 @@ namespace FreeSql.Internal { ), new[] { typeExp, indexesExp, rowExp, dataIndexExp }).Compile(); var typeGeneric = type; - if (typeGeneric.FullName.StartsWith("System.Nullable`1[")) typeGeneric = type.GenericTypeArguments.First(); + if (typeGeneric.IsNullableType()) typeGeneric = type.GenericTypeArguments.First(); if (typeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric)) return Expression.Lambda>( @@ -567,7 +565,7 @@ namespace FreeSql.Internal { ); else { var fieldtypeGeneric = field.FieldType; - if (fieldtypeGeneric.FullName.StartsWith("System.Nullable`1[")) fieldtypeGeneric = fieldtypeGeneric.GenericTypeArguments.First(); + if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GenericTypeArguments.First(); if (fieldtypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(fieldtypeGeneric)) read2ExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)), @@ -653,7 +651,7 @@ namespace FreeSql.Internal { ); else { var proptypeGeneric = ctorParm.ParameterType; - if (proptypeGeneric.FullName.StartsWith("System.Nullable`1[")) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); if (proptypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(ctorParm.ParameterType, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)), @@ -701,7 +699,7 @@ namespace FreeSql.Internal { ); else { var proptypeGeneric = prop.PropertyType; - if (proptypeGeneric.FullName.StartsWith("System.Nullable`1[")) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); if (proptypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, MethodDataReaderGetValue, tryidxExp)), @@ -825,7 +823,7 @@ namespace FreeSql.Internal { ) ); } - if (type.FullName.StartsWith("System.Nullable`1[")) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GenericTypeArguments.First(); if (type.IsEnum) return Expression.Return(returnTarget, Expression.Call(MethodEnumParse, Expression.Constant(type, typeof(Type)), Expression.Call(MethodToString, valueExp), Expression.Constant(true, typeof(bool)))); switch(type.FullName) { case "System.Guid": return Expression.IfThenElse( @@ -927,7 +925,7 @@ namespace FreeSql.Internal { // ), parmExp).Compile(); // } - // if (type.FullName.StartsWith("System.Nullable`1[")) type = type.GenericTypeArguments.First(); + // if (type.IsNullableType()) type = type.GenericTypeArguments.First(); // if (type.IsEnum) return Expression.Lambda>( // Expression.Call( // MethodEnumParse, @@ -1020,7 +1018,7 @@ namespace FreeSql.Internal { } return ret; } - if (type.FullName.StartsWith("System.Nullable`1[")) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GenericTypeArguments.First(); if (type.IsEnum) return Enum.Parse(type, string.Concat(value), true); switch (type.FullName) { case "System.Guid": diff --git a/FreeSql/Internal/UtilsReflection.cs b/FreeSql/Internal/UtilsReflection.cs index 25d60fe3..e90de4bf 100644 --- a/FreeSql/Internal/UtilsReflection.cs +++ b/FreeSql/Internal/UtilsReflection.cs @@ -70,10 +70,8 @@ namespace FreeSql.Internal { }); colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(Activator.CreateInstance(trytb.Type)); if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue; - if (colattr.IsNullable == false && colattr.DbDefautValue == null) { - var consturctorType = p.PropertyType.GenericTypeArguments.FirstOrDefault() ?? p.PropertyType; - colattr.DbDefautValue = Activator.CreateInstance(consturctorType); - } + if (colattr.IsNullable == false && colattr.DbDefautValue == null) + colattr.DbDefautValue = Activator.CreateInstance(p.PropertyType.IsNullableType() ? p.PropertyType.GenericTypeArguments.FirstOrDefault() : p.PropertyType); var col = new ColumnInfo { Table = trytb, @@ -177,7 +175,7 @@ namespace FreeSql.Internal { internal static (object value, int dataIndex) ExecuteArrayRowReadClassOrTuple(Type type, Dictionary names, object[] row, int dataIndex = 0) { if (type.IsArray) return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1); var typeGeneric = type; - if (typeGeneric.FullName.StartsWith("System.Nullable`1[")) typeGeneric = type.GenericTypeArguments.First(); + if (typeGeneric.IsNullableType()) typeGeneric = type.GenericTypeArguments.First(); if (typeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric)) return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1); @@ -251,7 +249,7 @@ namespace FreeSql.Internal { } return ret; } - if (type.FullName.StartsWith("System.Nullable`1[")) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GenericTypeArguments.First(); if (type.IsEnum) return Enum.Parse(type, string.Concat(value), true); switch(type.FullName) { case "System.Guid": diff --git a/FreeSql/MySql/MySqlCodeFirst.cs b/FreeSql/MySql/MySqlCodeFirst.cs index 68c734b2..5d21c230 100644 --- a/FreeSql/MySql/MySqlCodeFirst.cs +++ b/FreeSql/MySql/MySqlCodeFirst.cs @@ -65,7 +65,7 @@ namespace FreeSql.MySql { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.FullName.StartsWith("System.Nullable`1[") && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); if (enumType != null) { var names = string.Join(",", Enum.GetNames(enumType).Select(a => _commonUtils.FormatSql("{0}", a))); var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/FreeSql/MySql/MySqlExpression.cs b/FreeSql/MySql/MySqlExpression.cs index 451bf466..451f6e71 100644 --- a/FreeSql/MySql/MySqlExpression.cs +++ b/FreeSql/MySql/MySqlExpression.cs @@ -246,10 +246,10 @@ namespace FreeSql.MySql { case "AddTicks": return $"date_add({left}, interval ({args1})/10 microsecond)"; case "AddYears": return $"date_add({left}, interval ({args1}) year)"; case "Subtract": - if (exp.Arguments[0].Type.FullName == "System.DateTime" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.DateTime") - return $"timestampdiff(microsecond, {args1}, {left})"; - if (exp.Arguments[0].Type.FullName == "System.TimeSpan" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.TimeSpan") - return $"date_sub({left}, interval ({args1}) microsecond)"; + switch((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) { + case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})"; + case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)"; + } break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"(({left}) - ({getExp(exp.Arguments[0])}))"; diff --git a/FreeSql/Oracle/OracleCodeFirst.cs b/FreeSql/Oracle/OracleCodeFirst.cs index e0a2e3ab..dc88797d 100644 --- a/FreeSql/Oracle/OracleCodeFirst.cs +++ b/FreeSql/Oracle/OracleCodeFirst.cs @@ -59,7 +59,7 @@ namespace FreeSql.Oracle { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.FullName.StartsWith("System.Nullable`1[") && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? (OracleDbType.Int32, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0)) : diff --git a/FreeSql/Oracle/OracleExpression.cs b/FreeSql/Oracle/OracleExpression.cs index a7a48fc9..67b43b03 100644 --- a/FreeSql/Oracle/OracleExpression.cs +++ b/FreeSql/Oracle/OracleExpression.cs @@ -247,10 +247,10 @@ namespace FreeSql.Oracle { case "AddTicks": return $"({left}+({args1})/864000000000)"; case "AddYears": return $"add_months({left},({args1})*12)"; case "Subtract": - if (exp.Arguments[0].Type.FullName == "System.DateTime" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.DateTime") - return $"({args1}-{left})"; - if (exp.Arguments[0].Type.FullName == "System.TimeSpan" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.TimeSpan") - return $"({left}-{args1})"; + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) { + case "System.DateTime": return $"({args1}-{left})"; + case "System.TimeSpan": return $"({left}-{args1})"; + } break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"extract(day from ({left}-({getExp(exp.Arguments[0])})))"; diff --git a/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs b/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs index 232db02d..e277dc31 100644 --- a/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs +++ b/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs @@ -104,7 +104,7 @@ namespace FreeSql.PostgreSQL { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (NpgsqlDbType, string, string, bool?, object)?((trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.FullName.StartsWith("System.Nullable`1[") && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? (NpgsqlDbType.Bigint, "int8", $"int8{(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0)) : diff --git a/FreeSql/PostgreSQL/PostgreSQLExpression.cs b/FreeSql/PostgreSQL/PostgreSQLExpression.cs index 5518e66d..10d6a932 100644 --- a/FreeSql/PostgreSQL/PostgreSQLExpression.cs +++ b/FreeSql/PostgreSQL/PostgreSQLExpression.cs @@ -343,10 +343,10 @@ namespace FreeSql.PostgreSQL { case "AddTicks": return $"(({left})::timestamp+(({args1})/10||' microseconds')::interval)"; case "AddYears": return $"(({left})::timestamp+(({args1})||' year')::interval)"; case "Subtract": - if (exp.Arguments[0].Type.FullName == "System.DateTime" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.DateTime") - return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)"; - if (exp.Arguments[0].Type.FullName == "System.TimeSpan" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.TimeSpan") - return $"(({left})::timestamp-(({args1})||' microseconds')::interval)"; + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) { + case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)"; + case "System.TimeSpan": return $"(({left})::timestamp-(({args1})||' microseconds')::interval)"; + } break; case "Equals": return $"({left} = ({getExp(exp.Arguments[0])})::timestamp)"; case "CompareTo": return $"extract(epoch from ({left})::timestamp-({getExp(exp.Arguments[0])})::timestamp)"; diff --git a/FreeSql/PostgreSQL/PostgreSQLUtils.cs b/FreeSql/PostgreSQL/PostgreSQLUtils.cs index b3d2c145..d0d972e2 100644 --- a/FreeSql/PostgreSQL/PostgreSQLUtils.cs +++ b/FreeSql/PostgreSQL/PostgreSQLUtils.cs @@ -53,13 +53,13 @@ namespace FreeSql.PostgreSQL { var elementType = type.GetElementType(); Type enumType = null; if (elementType.IsEnum) enumType = elementType; - else if (elementType.FullName.StartsWith("System.Nullable`1[") && elementType.GenericTypeArguments.First().IsEnum) enumType = elementType.GenericTypeArguments.First(); + else if (elementType.IsNullableType() && elementType.GenericTypeArguments.First().IsEnum) enumType = elementType.GenericTypeArguments.First(); if (enumType != null) return enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? getParamterArrayValue(typeof(long), value, elementType.IsEnum ? null : Enum.GetValues(enumType).GetValue(0)) : getParamterArrayValue(typeof(int), value, elementType.IsEnum ? null : Enum.GetValues(enumType).GetValue(0)); return dicGetParamterValue.TryGetValue(type.FullName, out var trydicarr) ? trydicarr(value) : value; } - if (type.FullName.StartsWith("System.Nullable`1[")) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GenericTypeArguments.First(); if (type.IsEnum) return (int)value; if (dicGetParamterValue.TryGetValue(type.FullName, out var trydic)) return trydic(value); return value; diff --git a/FreeSql/SqlServer/SqlServerCodeFirst.cs b/FreeSql/SqlServer/SqlServerCodeFirst.cs index eeeea030..c0b491cb 100644 --- a/FreeSql/SqlServer/SqlServerCodeFirst.cs +++ b/FreeSql/SqlServer/SqlServerCodeFirst.cs @@ -58,7 +58,7 @@ namespace FreeSql.SqlServer { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.FullName.StartsWith("System.Nullable`1[") && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? (SqlDbType.BigInt, "bigint", $"bigint{(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0)) : diff --git a/FreeSql/SqlServer/SqlServerExpression.cs b/FreeSql/SqlServer/SqlServerExpression.cs index 405c51ac..bb9e7e3f 100644 --- a/FreeSql/SqlServer/SqlServerExpression.cs +++ b/FreeSql/SqlServer/SqlServerExpression.cs @@ -228,10 +228,10 @@ namespace FreeSql.SqlServer { case "AddTicks": return $"dateadd(second, ({args1})/10000000, {left})"; case "AddYears": return $"dateadd(year, {args1}, {left})"; case "Subtract": - if (exp.Arguments[0].Type.FullName == "System.DateTime" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.DateTime") - return $"datediff(second, {args1}, {left})"; - if (exp.Arguments[0].Type.FullName == "System.TimeSpan" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.TimeSpan") - return $"dateadd(second, {args1}*-1, {left})"; + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) { + case "System.DateTime": return $"datediff(second, {args1}, {left})"; + case "System.TimeSpan": return $"dateadd(second, {args1}*-1, {left})"; + } break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"(({left}) - ({getExp(exp.Arguments[0])}))"; diff --git a/FreeSql/Sqlite/SqliteCodeFirst.cs b/FreeSql/Sqlite/SqliteCodeFirst.cs index 6d970ede..ca8a61d6 100644 --- a/FreeSql/Sqlite/SqliteCodeFirst.cs +++ b/FreeSql/Sqlite/SqliteCodeFirst.cs @@ -57,7 +57,7 @@ namespace FreeSql.Sqlite { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.FullName.StartsWith("System.Nullable`1[") && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? (DbType.Int64, "bigint", $"bigint{(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0)) : diff --git a/FreeSql/Sqlite/SqliteExpression.cs b/FreeSql/Sqlite/SqliteExpression.cs index 33924bf1..a4efef98 100644 --- a/FreeSql/Sqlite/SqliteExpression.cs +++ b/FreeSql/Sqlite/SqliteExpression.cs @@ -251,10 +251,10 @@ namespace FreeSql.Sqlite { case "AddTicks": return $"datetime({left},(({args1})/10000000)||' seconds')"; case "AddYears": return $"datetime({left},({args1})||' years')"; case "Subtract": - if (exp.Arguments[0].Type.FullName == "System.DateTime" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.DateTime") - return $"(strftime('%s',{left})-strftime('%s',{args1}))"; - if (exp.Arguments[0].Type.FullName == "System.TimeSpan" || exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault()?.FullName == "System.TimeSpan") - return $"datetime({left},(-{args1})||' seconds')"; + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) { + case "System.DateTime": return $"(strftime('%s',{left})-strftime('%s',{args1}))"; + case "System.TimeSpan": return $"datetime({left},(-{args1})||' seconds')"; + } break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"(strftime('%s',{left})-strftime('%s',{args1}))";