diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index d6868178..7312f114 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -1,17 +1,48 @@ using FreeSql; +using FreeSql.DataAnnotations; +using FreeSql.Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; +using System.Linq.Expressions; using System.Threading.Tasks; namespace base_entity { class Program { + class TestConfig + { + public int clicks { get; set; } + public string title { get; set; } + } + [Table(Name = "sysconfig")] + public class S_SysConfig : BaseEntity> + { + [Column(IsPrimary = true)] + public string Name { get; set; } + + [JsonMap] + public T Config { get; set; } + } + static void Main(string[] args) { + #region 初始化 IFreeSql BaseEntity.Initialization(new FreeSql.FreeSqlBuilder() .UseAutoSyncStructure(true) + .UseNoneCommandParameter(true) .UseConnectionString(FreeSql.DataType.Sqlite, "data source=test.db;max pool size=5") + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2") .Build()); + #endregion + + BaseEntity.Orm.UseJsonMap(); + + new S_SysConfig { Name = "testkey11", Config = new TestConfig { clicks = 11, title = "testtitle11" } }.Save(); + new S_SysConfig { Name = "testkey22", Config = new TestConfig { clicks = 22, title = "testtitle22" } }.Save(); + new S_SysConfig { Name = "testkey33", Config = new TestConfig { clicks = 33, title = "testtitle33" } }.Save(); + var testconfigs11 = S_SysConfig.Select.ToList(); Task.Run(async () => { diff --git a/Examples/base_entity/base_entity.csproj b/Examples/base_entity/base_entity.csproj index c05b214a..f177d568 100644 --- a/Examples/base_entity/base_entity.csproj +++ b/Examples/base_entity/base_entity.csproj @@ -15,6 +15,7 @@ + diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index 365ae1b0..e7e82ce5 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -43,7 +43,7 @@ namespace FreeSql /// 创建时间 /// [Column(Position = -4)] - public DateTime CreateTime { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; /// /// 更新时间 /// diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index d6d6f617..d293c21e 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.9.12 + 0.9.15 true YeXiangQin BaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用. @@ -12,6 +12,7 @@ MIT FreeSql;ORM;BaseEntity $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Extensions/FreeSql.Extensions.JsonMap/DataAnnotations/JsonMapAttribute.cs b/Extensions/FreeSql.Extensions.JsonMap/DataAnnotations/JsonMapAttribute.cs new file mode 100644 index 00000000..44f5d8a1 --- /dev/null +++ b/Extensions/FreeSql.Extensions.JsonMap/DataAnnotations/JsonMapAttribute.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; + +namespace FreeSql.DataAnnotations +{ + + /// + /// 当实体类属性为【对象】时,以JSON形式映射存储 + /// + public class JsonMapAttribute : Attribute + { + } +} diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj new file mode 100644 index 00000000..a4e16229 --- /dev/null +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -0,0 +1,29 @@ + + + + netstandard2.0;net45 + 0.9.15 + true + YeXiangQin + FreeSql 扩展包,可实现实体类属性为对象时,以JSON形式映射存储. + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png + $(AssemblyName) + true + true + + + + + + + + + + + diff --git a/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs b/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs new file mode 100644 index 00000000..e5593617 --- /dev/null +++ b/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs @@ -0,0 +1,58 @@ +using FreeSql.DataAnnotations; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; + +namespace FreeSql.Extensions +{ + public static class JsonMapCore + { + static bool _isAoped = false; + static object _isAopedLock = new object(); + static ConcurrentDictionary _dicTypes = new ConcurrentDictionary(); + static MethodInfo MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + static MethodInfo MethodJsonConvertSerializeObject = typeof(JsonConvert).GetMethod("SerializeObject", new[] { typeof(object) }); + + /// + /// 当实体类属性为【对象】时,并且标记特性 [JsonMap] 时,该属性将以JSON形式映射存储 + /// + /// + public static void UseJsonMap(this IFreeSql that) + { + if (_isAoped == false) + lock(_isAopedLock) + if (_isAoped == false) + { + _isAoped = true; + + FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => + { + if (_dicTypes.ContainsKey(type)) return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type)), type)); + return null; + }); + + that.Aop.ConfigEntityProperty += new EventHandler((s, e) => + { + if (e.Property.GetCustomAttribute(false) != null) + { + e.ModifyResult.MapType = typeof(string); + if (_dicTypes.TryAdd(e.Property.PropertyType, true)) + { + FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionObjectToStringIfThenElse.Add((LabelTarget returnTarget, Expression valueExp, Expression elseExp, Type type) => + { + return Expression.IfThenElse( + Expression.TypeEqual(valueExp, e.Property.PropertyType), + Expression.Return(returnTarget, Expression.Call(MethodJsonConvertSerializeObject, Expression.Convert(valueExp, typeof(object))), typeof(object)), + elseExp); + }); + } + } + }); + } + } + } +} diff --git a/Extensions/FreeSql.Extensions.JsonMap/readme.md b/Extensions/FreeSql.Extensions.JsonMap/readme.md new file mode 100644 index 00000000..96906cd8 --- /dev/null +++ b/Extensions/FreeSql.Extensions.JsonMap/readme.md @@ -0,0 +1,23 @@ +FreeSql 扩展包,将值对象映射成 typeof(string),安装扩展包: + +> dotnet add package FreeSql.Extensions.JsonMap + +```csharp +fsql.UseJsonMap(); //开启功能 + +class TestConfig +{ + public int clicks { get; set; } + public string title { get; set; } +} + +[Table(Name = "sysconfig")] +public class S_SysConfig +{ + [Column(IsPrimary = true)] + public string Name { get; set; } + + [JsonMap] + public T Config { get; set; } +} +``` \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 1a3a82c9..c1d3828d 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 扩展包,可实现【延时加载】属性. @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index f979a9ec..1b6415fb 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. @@ -11,6 +11,7 @@ git MIT $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 1f98a00a..290e6b23 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository @@ -11,6 +11,7 @@ git MIT $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index 4f95cf07..edf94e73 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -406,6 +406,9 @@ namespace FreeSql.Tests [Fact] public void Test1() { + + var testssargs1 = "10100"; + var testformatsql1 = g.mysql.Select().Where(a => a.NamespaceName == $"1_{10100}").ToSql(); var testorderbysql = g.mysql.Select().OrderByDescending(a => a.OptionsEntity04 + (a.score ?? 0)).ToSql(); var testincludeMemberssql1 = g.sqlite.Select().Where(a => a.Templates.Title == "1").ToList(); diff --git a/FreeSql.sln b/FreeSql.sln index 78427fa6..42ee6d17 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -58,6 +58,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "base_entity", "Examples\bas EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.BaseEntity", "Extensions\FreeSql.Extensions.BaseEntity\FreeSql.Extensions.BaseEntity.csproj", "{FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.JsonMap", "Extensions\FreeSql.Extensions.JsonMap\FreeSql.Extensions.JsonMap.csproj", "{3043DEF1-85DF-47AD-8D5D-327270794356}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -332,6 +334,18 @@ Global {FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6}.Release|x64.Build.0 = Release|Any CPU {FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6}.Release|x86.ActiveCfg = Release|Any CPU {FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6}.Release|x86.Build.0 = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|x64.ActiveCfg = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|x64.Build.0 = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|x86.ActiveCfg = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Debug|x86.Build.0 = Debug|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|Any CPU.Build.0 = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|x64.ActiveCfg = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|x64.Build.0 = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|x86.ActiveCfg = Release|Any CPU + {3043DEF1-85DF-47AD-8D5D-327270794356}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -352,6 +366,7 @@ Global {4C0973CB-BD49-4A5B-A6FE-EE0594BDD513} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} {D3A1869C-A8DE-46D0-8587-89EBBE3E4DD0} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} {FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} + {3043DEF1-85DF-47AD-8D5D-327270794356} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index 21dede2d..9040fe96 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -77,7 +77,9 @@ namespace FreeSql.DataAnnotations public object DbDefautValue { get; internal set; } /// - /// 类型映射,比如:可将 enum 属性映射成 typeof(string) + /// 类型映射,除了可做基本的类型映射外,特别介绍的功能: + /// 1、将 enum 属性映射成 typeof(string) + /// 2、将 对象 属性映射成 typeof(string),请安装扩展包 FreeSql.Extensions.JsonMap /// public Type MapType { get; set; } diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index d5f2185f..ac1c46e2 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 82735bc2..3ce7b5a3 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -57,7 +57,9 @@ - 类型映射,比如:可将 enum 属性映射成 typeof(string) + 类型映射,除了可做基本的类型映射外,特别介绍的功能: + 1、将 enum 属性映射成 typeof(string) + 2、将 对象 属性映射成 typeof(string),请安装扩展包 FreeSql.Extensions.JsonMap diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index deada8a9..4fc329c6 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -535,14 +535,16 @@ namespace FreeSql.Internal tsc.mapType = null; var exp3 = exp as MethodCallExpression; var callType = exp3.Object?.Type ?? exp3.Method.DeclaringType; + string other3Exp = null; switch (callType.FullName) { - case "System.String": return ExpressionLambdaToSqlCallString(exp3, tsc); - case "System.Math": return ExpressionLambdaToSqlCallMath(exp3, tsc); - case "System.DateTime": return ExpressionLambdaToSqlCallDateTime(exp3, tsc); - case "System.TimeSpan": return ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); - case "System.Convert": return ExpressionLambdaToSqlCallConvert(exp3, tsc); + case "System.String": other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); break; + case "System.Math": other3Exp = ExpressionLambdaToSqlCallMath(exp3, tsc); break; + case "System.DateTime": other3Exp = ExpressionLambdaToSqlCallDateTime(exp3, tsc); break; + case "System.TimeSpan": other3Exp = ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); break; + case "System.Convert": other3Exp = ExpressionLambdaToSqlCallConvert(exp3, tsc); break; } + if (string.IsNullOrEmpty(other3Exp) == false) return other3Exp; if (exp3.Method.Name == "Equals" && exp3.Object != null && exp3.Arguments.Count > 0) return ExpressionBinary("=", exp3.Object, exp3.Arguments[0], tsc); if (callType.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) @@ -849,7 +851,7 @@ namespace FreeSql.Internal // } //} - var other3Exp = ExpressionLambdaToSqlOther(exp3, tsc); + other3Exp = ExpressionLambdaToSqlOther(exp3, tsc); if (string.IsNullOrEmpty(other3Exp) == false) return other3Exp; if (exp3.IsParameter() == false) return formatSql(Expression.Lambda(exp3).Compile().DynamicInvoke(), tsc.mapType); throw new Exception($"未实现函数表达式 {exp3} 解析"); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index f3dbe11d..6b7824c1 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1466,7 +1466,8 @@ namespace FreeSql.Internal static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public); static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset).GetConstructor(new[] { typeof(long), typeof(TimeSpan) }); - public static ConcurrentBag> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag>(); + public static ConcurrentBag> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag>(); + public static ConcurrentBag> GetDataReaderValueBlockExpressionObjectToStringIfThenElse = new ConcurrentBag>(); public static Expression GetDataReaderValueBlockExpression(Type type, Expression value) { var returnTarget = Expression.Label(typeof(object)); @@ -1728,11 +1729,14 @@ namespace FreeSql.Internal default: foreach (var switchFunc in GetDataReaderValueBlockExpressionSwitchTypeFullName) { - var switchFuncRet = switchFunc(returnTarget, valueExp, type.FullName); + var switchFuncRet = switchFunc(returnTarget, valueExp, type); if (switchFuncRet != null) return switchFuncRet; } break; } + Expression callToStringExp = Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))); + foreach (var toStringFunc in GetDataReaderValueBlockExpressionObjectToStringIfThenElse) + callToStringExp = toStringFunc(returnTarget, valueExp, callToStringExp, type); Expression switchExp = null; if (tryparseExp != null) switchExp = Expression.Switch( @@ -1753,12 +1757,12 @@ namespace FreeSql.Internal Expression.SwitchCase(Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))), Expression.Constant(type)) ); else if (type == typeof(string)) - switchExp = Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))); + switchExp = callToStringExp; else switchExp = Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))); var defaultRetExp = type == typeof(string) ? - Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))) : + callToStringExp : Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))); return Expression.IfThenElse( diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 0a95f0f2..83500b51 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net452 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index d9fb104f..d74aa632 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -310,7 +310,7 @@ namespace FreeSql.MySql case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; } } - throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { @@ -338,7 +338,7 @@ namespace FreeSql.MySql case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; case "Truncate": return $"truncate({getExp(exp.Arguments[0])}, 0)"; } - throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { @@ -388,7 +388,7 @@ namespace FreeSql.MySql case "ToString": return $"date_format({left}, '%Y-%m-%d %H:%i:%s.%f')"; } } - throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { @@ -424,7 +424,7 @@ namespace FreeSql.MySql case "ToString": return $"cast({left} as char)"; } } - throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { @@ -450,7 +450,7 @@ namespace FreeSql.MySql case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as unsigned)"; } } - throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); + return null; } } } diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index f53a0ebe..c62decfe 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -22,9 +22,9 @@ namespace FreeSql.MySql Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPolygon)] = true; var MethodMygisGeometryParse = typeof(MygisGeometry).GetMethod("Parse", new[] { typeof(string) }); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, string typeFullName) => + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => { - switch (typeFullName) + switch (type.FullName) { case "MygisPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPoint))); case "MygisLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisLineString))); diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 27540c59..7b1b720a 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index e33a267d..a5e45c58 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 Oracle 11 @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 3bf13ec4..d516f0a2 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -310,7 +310,7 @@ namespace FreeSql.Oracle case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; } } - throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { @@ -340,7 +340,7 @@ namespace FreeSql.Oracle //case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; case "Truncate": return $"trunc({getExp(exp.Arguments[0])}, 0)"; } - throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { @@ -390,7 +390,7 @@ namespace FreeSql.Oracle case "ToString": return $"to_char({left},'YYYY-MM-DD HH24:MI:SS.FF6')"; } } - throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { @@ -426,7 +426,7 @@ namespace FreeSql.Oracle case "ToString": return $"to_char({left})"; } } - throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { @@ -452,7 +452,7 @@ namespace FreeSql.Oracle case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as number)"; } } - throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); + return null; } } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 14a68880..31cadc17 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 PostgreSQL 9.5 @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index e0bc9eab..e6c3bd02 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -421,7 +421,7 @@ namespace FreeSql.PostgreSQL case "Equals": return $"({left} = ({getExp(exp.Arguments[0])})::varchar)"; } } - throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { @@ -449,7 +449,7 @@ namespace FreeSql.PostgreSQL case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; case "Truncate": return $"trunc({getExp(exp.Arguments[0])}, 0)"; } - throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { @@ -499,7 +499,7 @@ namespace FreeSql.PostgreSQL case "ToString": return $"to_char({left}, 'YYYY-MM-DD HH24:MI:SS.US')"; } } - throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { @@ -535,7 +535,7 @@ namespace FreeSql.PostgreSQL case "ToString": return $"({left})::varchar"; } } - throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { @@ -561,7 +561,7 @@ namespace FreeSql.PostgreSQL case "ToUInt64": return $"({getExp(exp.Arguments[0])})::int8"; } } - throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); + return null; } } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index b3f949aa..21627b10 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -51,9 +51,9 @@ namespace FreeSql.PostgreSQL var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, string typeFullName) => + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => { - switch (typeFullName) + switch (type.FullName) { case "Newtonsoft.Json.Linq.JToken": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))); case "Newtonsoft.Json.Linq.JObject": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))); diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 94c9b532..a2067ff8 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -2,7 +2,7 @@ netstandard2.0;net451 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 24fd1a33..28b7cc4e 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -292,7 +292,7 @@ namespace FreeSql.SqlServer case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; } } - throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { @@ -320,7 +320,7 @@ namespace FreeSql.SqlServer case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; case "Truncate": return $"floor({getExp(exp.Arguments[0])})"; } - throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { @@ -370,7 +370,7 @@ namespace FreeSql.SqlServer case "ToString": return $"convert(varchar, {left}, 121)"; } } - throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { @@ -406,7 +406,7 @@ namespace FreeSql.SqlServer case "ToString": return $"cast({left} as varchar)"; } } - throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { @@ -432,7 +432,7 @@ namespace FreeSql.SqlServer case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as bigint)"; } } - throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); + return null; } } } diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index e22d4e66..1bcc27a7 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.12 + 0.9.15 true YeXiangQin FreeSql 数据库实现,基于 Sqlite 3.0 @@ -12,6 +12,7 @@ MIT FreeSql;ORM $(AssemblyName) + https://github.com/2881099/FreeSql/blob/master/logo.png $(AssemblyName) true true diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index b3f1541e..cca89bb8 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -314,7 +314,7 @@ namespace FreeSql.Sqlite case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; } } - throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { @@ -342,7 +342,7 @@ namespace FreeSql.Sqlite case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; //case "Truncate": return $"truncate({getExp(exp.Arguments[0])}, 0)"; } - throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { @@ -392,7 +392,7 @@ namespace FreeSql.Sqlite case "ToString": return $"strftime('%Y-%m-%d %H:%M.%f',{left})"; } } - throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { @@ -428,7 +428,7 @@ namespace FreeSql.Sqlite case "ToString": return $"cast({left} as character)"; } } - throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); + return null; } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { @@ -454,7 +454,7 @@ namespace FreeSql.Sqlite case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as decimal(21,0))"; } } - throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); + return null; } } } diff --git a/logo.png b/logo.png new file mode 100644 index 00000000..d7e56b8d Binary files /dev/null and b/logo.png differ diff --git a/readme.md b/readme.md index 67459e42..cef97c6f 100644 --- a/readme.md +++ b/readme.md @@ -55,6 +55,8 @@ FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore | FreeSql.Provider.Sqlite | NETStandard2.0、net45 | | FreeSql.Provider.Oracle | NETStandard2.0、net45 | | FreeSql.Extensions.LazyLoading | NETStandard2.0、net45 | +| FreeSql.Extensions.JsonMap | NETStandard2.0、net45 | +| FreeSql.Extensions.BaseEntity | NETStandard2.0 | # Quick start