From eb182b15bc97b53b1168a0ef2cbeaf6faf91d4e0 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 01:27:48 +0800 Subject: [PATCH 1/7] Mac OS DbFirst Bug --- .../SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs index 463f8c5bd..599335301 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -247,13 +248,15 @@ namespace SqlSugar } public void CreateClassFile(string directoryPath, string nameSpace = "Models") { + var seChar= Path.DirectorySeparatorChar.ToString(); Check.ArgumentNullException(directoryPath, "directoryPath can't null"); var classStringList = ToClassStringList(nameSpace); if (classStringList.IsValuable()) { foreach (var item in classStringList) { - FileHelper.CreateFile(directoryPath.TrimEnd('\\').TrimEnd('/') + string.Format("\\{0}.cs", item.Key), item.Value, Encoding.UTF8); + var filePath = directoryPath.TrimEnd('\\').TrimEnd('/') + string.Format(seChar + "{0}.cs", item.Key); + FileHelper.CreateFile(filePath, item.Value, Encoding.UTF8); } } } From 91815b6b8e76c1215658aad57e2ddc166dd4c03c Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 01:44:17 +0800 Subject: [PATCH 2/7] 4.6.0.6 --- Src/Asp.Net/SqlServerTest/UnitTest/Query/SingleQuery.cs | 8 ++++++++ .../ResolveItems/MethodCallExpressionResolve.cs | 2 +- Src/Asp.Net/SqlSugar/Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/Query/SingleQuery.cs b/Src/Asp.Net/SqlServerTest/UnitTest/Query/SingleQuery.cs index 7d1c4d65b..c06102a0c 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/Query/SingleQuery.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/Query/SingleQuery.cs @@ -124,6 +124,14 @@ namespace OrmTest.UnitTest new SugarParameter("@Id0",1), new SugarParameter("@Const1",1) }, t13.Key, t13.Value, "single t13 error "); + + + var t14 = db.Queryable() + .Where(it => it.Name == "a" && SqlFunc.HasValue(it.Name)).ToSql(); + base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] WHERE (( [Name] = @Name0 ) AND ( [Name]<>'' AND [Name] IS NOT NULL ))", + new List() { + new SugarParameter("@Name0","a") + }, t14.Key, t14.Value, "single t14 error "); } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 5fba25a20..fd30e7c6c 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -209,7 +209,7 @@ namespace SqlSugar model.Args.AddRange(appendArgs); } var methodValue = GetMdthodValue(name, model); - if (parameter.BaseExpression is BinaryExpression && parameter.OppsiteExpression.Type == UtilConstants.BoolType&&name=="HasValue") { + if (parameter.BaseExpression is BinaryExpression && parameter.OppsiteExpression.Type == UtilConstants.BoolType&&name=="HasValue"&&!(parameter.OppsiteExpression is BinaryExpression)) { methodValue = this.Context.DbMehtods.CaseWhen(new List>() { new KeyValuePair("IF",methodValue.ObjToString()), new KeyValuePair("Return","1"), diff --git a/Src/Asp.Net/SqlSugar/Properties/AssemblyInfo.cs b/Src/Asp.Net/SqlSugar/Properties/AssemblyInfo.cs index 1c2875fa2..971196ddb 100644 --- a/Src/Asp.Net/SqlSugar/Properties/AssemblyInfo.cs +++ b/Src/Asp.Net/SqlSugar/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.6.0.5")] -[assembly: AssemblyFileVersion("4.6.0.5")] +[assembly: AssemblyVersion("4.6.0.6")] +[assembly: AssemblyFileVersion("4.6.0.6")] From b3977225690a34dad1fe31099390c876f8305a2b Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 01:46:41 +0800 Subject: [PATCH 3/7] Update Nuget --- Src/Asp.Net/SqlSugar/SqlSugar.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.nuspec b/Src/Asp.Net/SqlSugar/SqlSugar.nuspec index 1d101a91c..088e0b4ff 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.nuspec +++ b/Src/Asp.Net/SqlSugar/SqlSugar.nuspec @@ -2,7 +2,7 @@ sqlSugar - 4.6.0.5 + 4.6.0.6 SqlSugar .Net Framework 4.0+ ORM sun kaixuan landa From c2228405bf1b02d16675ada26a8228150a61c037 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 01:51:59 +0800 Subject: [PATCH 4/7] Update Core --- .../Abstract/DbBindProvider/DbBindProvider.cs | 2 +- .../DbFirstProvider/DbFirstProvider.cs | 5 +- .../SqlBuilderProvider/DeleteBuilder.cs | 1 + .../SqlBuilderProvider/InsertBuilder.cs | 1 + .../SqlBuilderProvider/QueryBuilder.cs | 2 + .../SqlBuilderProvider/UpdateBuilder.cs | 1 + .../SqlSugar/Entities/ConnectionConfig.cs | 2 + .../DbMethods/SqlFuncExternal.cs | 13 + .../ExpressionsToSql/ExpressionContext.cs | 1 + .../ResolveItems/BaseResolve.cs | 1 + .../MethodCallExpressionResolve.cs | 241 ++++++++++-------- .../ExpressionsToSql/Subquery/SubTools.cs | 1 + .../SqlSugar/Interface/ILambdaExpressions.cs | 2 + .../SqlSeverTest/SqlSugar/SqlSugar.csproj | 6 +- 14 files changed, 170 insertions(+), 109 deletions(-) create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFuncExternal.cs diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index 7db20d88f..d49547c53 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -140,7 +140,7 @@ namespace SqlSugar public virtual string GetPropertyTypeName(string dbTypeName) { dbTypeName = dbTypeName.ToLower(); - var propertyTypes = MappingTypes.Where(it => it.Key == dbTypeName); + var propertyTypes = MappingTypes.Where(it => it.Key.Equals(dbTypeName,StringComparison.CurrentCultureIgnoreCase)); if (dbTypeName == "int32") { return "int"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs index 463f8c5bd..599335301 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbFirstProvider/DbFirstProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -247,13 +248,15 @@ namespace SqlSugar } public void CreateClassFile(string directoryPath, string nameSpace = "Models") { + var seChar= Path.DirectorySeparatorChar.ToString(); Check.ArgumentNullException(directoryPath, "directoryPath can't null"); var classStringList = ToClassStringList(nameSpace); if (classStringList.IsValuable()) { foreach (var item in classStringList) { - FileHelper.CreateFile(directoryPath.TrimEnd('\\').TrimEnd('/') + string.Format("\\{0}.cs", item.Key), item.Value, Encoding.UTF8); + var filePath = directoryPath.TrimEnd('\\').TrimEnd('/') + string.Format(seChar + "{0}.cs", item.Key); + FileHelper.CreateFile(filePath, item.Value, Encoding.UTF8); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs index b26a70528..c8c5afd07 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/DeleteBuilder.cs @@ -148,6 +148,7 @@ namespace SqlSugar resolveExpress.MappingColumns = Context.MappingColumns; resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreColumns; + resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices; resolveExpress.Resolve(expression, resolveType); if (this.Parameters == null) this.Parameters = new List(); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs index 82e92a3ea..1c5a24123 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs @@ -102,6 +102,7 @@ namespace SqlSugar resolveExpress.MappingColumns = Context.MappingColumns; resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreColumns; + resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices; resolveExpress.Resolve(expression, resolveType); this.Parameters.AddRange(resolveExpress.Parameters); var reval = resolveExpress.Result; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 25a9e3dbe..8be0ce83f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -216,12 +216,14 @@ namespace SqlSugar resolveExpress.MappingColumns = Context.MappingColumns; resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreColumns; + resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices; resolveExpress.InitMappingInfo = this.Context.InitMppingInfo; resolveExpress.RefreshMapping = () => { resolveExpress.MappingColumns = Context.MappingColumns; resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreColumns; + resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices; }; resolveExpress.Resolve(expression, resolveType); this.Parameters.AddRange(resolveExpress.Parameters); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index dbaf3fbdc..59f0875b0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -118,6 +118,7 @@ namespace SqlSugar resolveExpress.MappingColumns = Context.MappingColumns; resolveExpress.MappingTables = Context.MappingTables; resolveExpress.IgnoreComumnList = Context.IgnoreColumns; + resolveExpress.SqlFuncServices = Context.CurrentConnectionConfig.ConfigureExternalServices == null ? null : Context.CurrentConnectionConfig.ConfigureExternalServices.SqlFuncServices; } resolveExpress.Resolve(expression, resolveType); this.Parameters.AddRange(resolveExpress.Parameters); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Entities/ConnectionConfig.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Entities/ConnectionConfig.cs index 20b783ff7..d98c824be 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Entities/ConnectionConfig.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Entities/ConnectionConfig.cs @@ -83,5 +83,7 @@ namespace SqlSugar } set { _DataInfoCache = value; } } + + public List SqlFuncServices { get; set; } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFuncExternal.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFuncExternal.cs new file mode 100644 index 000000000..306475d74 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFuncExternal.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SqlSugar +{ + public class SqlFuncExternal + { + public string UniqueMethodName { get; set; } + public Func MethodValue { get; set; } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs index ee8b591a3..fe09f78b4 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs @@ -41,6 +41,7 @@ namespace SqlSugar public MappingColumnList MappingColumns { get; set; } public MappingTableList MappingTables { get; set; } public IgnoreColumnList IgnoreComumnList { get; set; } + public List SqlFuncServices { get; set; } public bool IsSingle { get diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 5dfcad7c4..91a0c1b51 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -256,6 +256,7 @@ namespace SqlSugar newContext.MappingColumns = this.Context.MappingColumns; newContext.MappingTables = this.Context.MappingTables; newContext.IgnoreComumnList = this.Context.IgnoreComumnList; + newContext.SqlFuncServices = this.Context.SqlFuncServices; newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle); this.Context.Index = newContext.Index; this.Context.ParameterIndex = newContext.ParameterIndex; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 00dcd94aa..fd30e7c6c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -14,7 +14,7 @@ namespace SqlSugar var express = base.Expression as MethodCallExpression; var isLeft = parameter.IsLeft; string methodName = express.Method.Name; - var isValidNativeMethod = MethodMapping.ContainsKey(methodName) && express.Method.DeclaringType.Namespace == ("System"); + var isValidNativeMethod = IsValidNativeMethod(express, methodName); List appendArgs = null; if (MethodTimeMapping.ContainsKey(methodName)) { @@ -55,7 +55,8 @@ namespace SqlSugar } return; } - else if (IsIfElse(express, methodName)) { + else if (IsIfElse(express, methodName)) + { CaseWhenResolve caseResole = new CaseWhenResolve(express, this.Context, parameter.OppsiteExpression); var appendSql = caseResole.GetSql(); if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle)) @@ -83,6 +84,17 @@ namespace SqlSugar } } + private bool IsValidNativeMethod(MethodCallExpression express, string methodName) + { + return MethodMapping.ContainsKey(methodName) && express.Method.DeclaringType.Namespace == ("System"); + } + + private bool IsExtMethod(string methodName) + { + if (this.Context.SqlFuncServices == null) return false; + return this.Context.SqlFuncServices.Select(it => it.UniqueMethodName).Contains(methodName); + } + private bool IsIfElse(MethodCallExpression express, string methodName) { if (methodName == "End"&& express.Object.Type==typeof(CaseWhen)) @@ -197,7 +209,7 @@ namespace SqlSugar model.Args.AddRange(appendArgs); } var methodValue = GetMdthodValue(name, model); - if (parameter.BaseExpression is BinaryExpression && parameter.OppsiteExpression.Type == UtilConstants.BoolType&&name=="HasValue") { + if (parameter.BaseExpression is BinaryExpression && parameter.OppsiteExpression.Type == UtilConstants.BoolType&&name=="HasValue"&&!(parameter.OppsiteExpression is BinaryExpression)) { methodValue = this.Context.DbMehtods.CaseWhen(new List>() { new KeyValuePair("IF",methodValue.ObjToString()), new KeyValuePair("Return","1"), @@ -342,110 +354,126 @@ namespace SqlSugar private object GetMdthodValue(string name, MethodCallExpressionModel model) { - switch (name) + if (IsExtMethod(name)) { - case "IIF": - return this.Context.DbMehtods.IIF(model); - case "HasNumber": - return this.Context.DbMehtods.HasNumber(model); - case "HasValue": - return this.Context.DbMehtods.HasValue(model); - case "IsNullOrEmpty": - return this.Context.DbMehtods.IsNullOrEmpty(model); - case "ToLower": - return this.Context.DbMehtods.ToLower(model); - case "ToUpper": - return this.Context.DbMehtods.ToUpper(model); - case "Trim": - return this.Context.DbMehtods.Trim(model); - case "Contains": - return this.Context.DbMehtods.Contains(model); - case "ContainsArray": - var caResult = this.Context.DbMehtods.ContainsArray(model); - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); - return caResult; - case "Equals": - return this.Context.DbMehtods.Equals(model); - case "DateIsSame": - if (model.Args.Count == 2) - return this.Context.DbMehtods.DateIsSameDay(model); - else - { - var dsResult = this.Context.DbMehtods.DateIsSameByType(model); - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); - return dsResult; - } - case "DateAdd": - if (model.Args.Count == 2) - return this.Context.DbMehtods.DateAddDay(model); - else - { - var daResult = this.Context.DbMehtods.DateAddByType(model); - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); - return daResult; - } - case "DateValue": - var dvResult = this.Context.DbMehtods.DateValue(model); - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); - return dvResult; - case "Between": - return this.Context.DbMehtods.Between(model); - case "StartsWith": - return this.Context.DbMehtods.StartsWith(model); - case "EndsWith": - return this.Context.DbMehtods.EndsWith(model); - case "ToInt32": - return this.Context.DbMehtods.ToInt32(model); - case "ToInt64": - return this.Context.DbMehtods.ToInt64(model); - case "ToDate": - return this.Context.DbMehtods.ToDate(model); - case "ToTime": - return this.Context.DbMehtods.ToTime(model); - case "ToString": - Check.Exception(model.Args.Count > 1, "ToString (Format) is not supported, Use ToString().If time formatting can be used it.Date.Year+\"-\"+it.Data.Month+\"-\"+it.Date.Day "); - return this.Context.DbMehtods.ToString(model); - case "ToDecimal": - return this.Context.DbMehtods.ToDecimal(model); - case "ToGuid": - return this.Context.DbMehtods.ToGuid(model); - case "ToDouble": - return this.Context.DbMehtods.ToDouble(model); - case "ToBool": - return this.Context.DbMehtods.ToBool(model); - case "Substring": - return this.Context.DbMehtods.Substring(model); - case "Replace": - return this.Context.DbMehtods.Replace(model); - case "Length": - return this.Context.DbMehtods.Length(model); - case "AggregateSum": - return this.Context.DbMehtods.AggregateSum(model); - case "AggregateAvg": - return this.Context.DbMehtods.AggregateAvg(model); - case "AggregateMin": - return this.Context.DbMehtods.AggregateMin(model); - case "AggregateMax": - return this.Context.DbMehtods.AggregateMax(model); - case "AggregateCount": - return this.Context.DbMehtods.AggregateCount(model); - case "MappingColumn": - var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model); - var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false; - Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right"); - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); - return mappingColumnResult; - case "IsNull": - return this.Context.DbMehtods.IsNull(model); - case "MergeString": - return this.Context.DbMehtods.MergeString(model.Args.Select(it=>it.MemberName.ObjToString()).ToArray()); - case "GetSelfAndAutoFill": - this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); - return this.Context.DbMehtods.GetSelfAndAutoFill(model.Args[0].MemberValue.ObjToString(), this.Context.IsSingle); - case "GetDate": - return this.Context.DbMehtods.GetDate(); - default: - break; + DbType type = DbType.SqlServer; + if (this.Context is SqlServerExpressionContext) + type = DbType.SqlServer; + else if (this.Context is MySqlExpressionContext) + type = DbType.MySql; + else if (this.Context is SqliteExpressionContext) + type = DbType.Sqlite; + else if(this.Context is OracleExpressionContext) + type = DbType.Oracle; + return this.Context.SqlFuncServices.First(it => it.UniqueMethodName == name).MethodValue(model,type,this.Context); + } + else + { + switch (name) + { + case "IIF": + return this.Context.DbMehtods.IIF(model); + case "HasNumber": + return this.Context.DbMehtods.HasNumber(model); + case "HasValue": + return this.Context.DbMehtods.HasValue(model); + case "IsNullOrEmpty": + return this.Context.DbMehtods.IsNullOrEmpty(model); + case "ToLower": + return this.Context.DbMehtods.ToLower(model); + case "ToUpper": + return this.Context.DbMehtods.ToUpper(model); + case "Trim": + return this.Context.DbMehtods.Trim(model); + case "Contains": + return this.Context.DbMehtods.Contains(model); + case "ContainsArray": + var caResult = this.Context.DbMehtods.ContainsArray(model); + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); + return caResult; + case "Equals": + return this.Context.DbMehtods.Equals(model); + case "DateIsSame": + if (model.Args.Count == 2) + return this.Context.DbMehtods.DateIsSameDay(model); + else + { + var dsResult = this.Context.DbMehtods.DateIsSameByType(model); + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); + return dsResult; + } + case "DateAdd": + if (model.Args.Count == 2) + return this.Context.DbMehtods.DateAddDay(model); + else + { + var daResult = this.Context.DbMehtods.DateAddByType(model); + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString()); + return daResult; + } + case "DateValue": + var dvResult = this.Context.DbMehtods.DateValue(model); + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); + return dvResult; + case "Between": + return this.Context.DbMehtods.Between(model); + case "StartsWith": + return this.Context.DbMehtods.StartsWith(model); + case "EndsWith": + return this.Context.DbMehtods.EndsWith(model); + case "ToInt32": + return this.Context.DbMehtods.ToInt32(model); + case "ToInt64": + return this.Context.DbMehtods.ToInt64(model); + case "ToDate": + return this.Context.DbMehtods.ToDate(model); + case "ToTime": + return this.Context.DbMehtods.ToTime(model); + case "ToString": + Check.Exception(model.Args.Count > 1, "ToString (Format) is not supported, Use ToString().If time formatting can be used it.Date.Year+\"-\"+it.Data.Month+\"-\"+it.Date.Day "); + return this.Context.DbMehtods.ToString(model); + case "ToDecimal": + return this.Context.DbMehtods.ToDecimal(model); + case "ToGuid": + return this.Context.DbMehtods.ToGuid(model); + case "ToDouble": + return this.Context.DbMehtods.ToDouble(model); + case "ToBool": + return this.Context.DbMehtods.ToBool(model); + case "Substring": + return this.Context.DbMehtods.Substring(model); + case "Replace": + return this.Context.DbMehtods.Replace(model); + case "Length": + return this.Context.DbMehtods.Length(model); + case "AggregateSum": + return this.Context.DbMehtods.AggregateSum(model); + case "AggregateAvg": + return this.Context.DbMehtods.AggregateAvg(model); + case "AggregateMin": + return this.Context.DbMehtods.AggregateMin(model); + case "AggregateMax": + return this.Context.DbMehtods.AggregateMax(model); + case "AggregateCount": + return this.Context.DbMehtods.AggregateCount(model); + case "MappingColumn": + var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model); + var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false; + Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right"); + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString()); + return mappingColumnResult; + case "IsNull": + return this.Context.DbMehtods.IsNull(model); + case "MergeString": + return this.Context.DbMehtods.MergeString(model.Args.Select(it => it.MemberName.ObjToString()).ToArray()); + case "GetSelfAndAutoFill": + this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString()); + return this.Context.DbMehtods.GetSelfAndAutoFill(model.Args[0].MemberValue.ObjToString(), this.Context.IsSingle); + case "GetDate": + return this.Context.DbMehtods.GetDate(); + default: + break; + } } return null; } @@ -495,6 +523,7 @@ namespace SqlSugar } private void CheckMethod(MethodCallExpression expression) { + if (IsExtMethod(expression.Method.Name)) return; Check.Exception(expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName, string.Format(ErrorMessage.MethodError, expression.Method.Name)); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index d2aa6d923..4e7b6338c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -38,6 +38,7 @@ namespace SqlSugar newContext.MappingColumns = context.MappingColumns; newContext.MappingTables = context.MappingTables; newContext.IgnoreComumnList = context.IgnoreComumnList; + newContext.SqlFuncServices = context.SqlFuncServices; newContext.Resolve(item, type); context.Index = newContext.Index; context.ParameterIndex = newContext.ParameterIndex; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ILambdaExpressions.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ILambdaExpressions.cs index 1707894e7..41ba6947a 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ILambdaExpressions.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ILambdaExpressions.cs @@ -11,6 +11,8 @@ namespace SqlSugar MappingColumnList MappingColumns { get; set; } MappingTableList MappingTables { get; set; } IgnoreColumnList IgnoreComumnList { get; set; } + List SqlFuncServices { get; set; } + List JoinQueryInfos { get; set; } bool IsSingle { get; set; } SqlSugarClient Context { get; set; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj index 0b215582b..d26e3906f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 4.6.0.5 + 4.6.0.6 sun_kai_xuan https://github.com/sunkaixuan/SqlSugar @@ -20,4 +20,8 @@ + + + + From 41b33fdf59657501a099eec46f00f672d094a697 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 02:02:36 +0800 Subject: [PATCH 5/7] Update Core Demo --- .../SqlSeverTest/Demos/C_ExtSqlFun.cs | 53 +++++++++++++++++++ .../SqlSeverTest/SqlSeverTest/Program.cs | 1 + 2 files changed, 54 insertions(+) create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/C_ExtSqlFun.cs diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/C_ExtSqlFun.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/C_ExtSqlFun.cs new file mode 100644 index 000000000..f0b4c0580 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/C_ExtSqlFun.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SqlSugar; +using OrmTest.Models; + +namespace OrmTest.Demo +{ + public class ExtSqlFun : DemoBase + { + public static SqlSugarClient GetDb() + { + //Create ext method + var expMethods = new List(); + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "MyToString", + MethodValue = (expInfo, dbType, expContext) => + { + return string.Format("CAST({0} AS VARCHAR(MAX))", expInfo.Args[0].MemberName); + } + }); + + var config = new ConnectionConfig() + { + ConnectionString = Config.ConnectionString, + DbType = DbType.SqlServer, + IsAutoCloseConnection = true, + ConfigureExternalServices = new ConfigureExternalServices() + { + SqlFuncServices = expMethods//set ext method + } + }; + + SqlSugarClient db = new SqlSugarClient(config); + return db; + } + + public static string MyToString(T str) + { + throw new NotSupportedException("Can only be used in expressions"); + } + + public static void Init() + { + var db = GetDb(); + var list = db.Queryable().Where(it => MyToString(it.Id) == "1302583").ToList(); + var sql = db.Queryable().Where(it => MyToString(it.Id) == "1302583").ToSql(); + Console.WriteLine(sql); + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs index 8fad6514c..bf77f7c1e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs @@ -39,6 +39,7 @@ namespace SqlSeverTest OrmTest.Demo.CodeFirst.Init(); OrmTest.Demo.MasterSlave.Init(); OrmTest.Demo.SharedConnection.Init(); + OrmTest.Demo.ExtSqlFun.Init(); } } } From 0ee4863057af0325182a3122dfa6e02b3d165890 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 02:04:12 +0800 Subject: [PATCH 6/7] - --- Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec index d2272a5ac..9e054cb07 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec @@ -2,7 +2,7 @@ sqlSugarCore - 4.6.0.5 + 4.6.0.6 sunkaixuan Landa http://www.apache.org/licenses/LICENSE-2.0.html From d353e03b0df773176724d4c624fdcfd25f379595 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 18 Nov 2017 02:08:45 +0800 Subject: [PATCH 7/7] - --- Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj index d26e3906f..0e93431fa 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj @@ -20,8 +20,4 @@ - - - -