From fd07594a451fd9f1fc2987a2b6119216d30b5e19 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 13 Nov 2017 13:12:46 +0800 Subject: [PATCH] Update Core --- .../Abstract/DbBindProvider/DbBindProvider.cs | 12 +- .../IDataReaderEntityBuilder.cs | 2 +- .../SqlBuilderProvider/InsertBuilder.cs | 5 + .../SqlBuilderProvider/UpdateBuilder.cs | 9 +- .../SqlSugar/Enum/ConditionalType.cs | 8 +- .../ExpressionsToSql/CaseWhen/CaseWhen.cs | 28 ++++ .../CaseWhen/CaseWhenResolve.cs | 52 +++++++ .../ExpressionsToSql/Common/ErrorMessage.cs | 2 +- .../ExpressionsToSql/Common/ExpressionTool.cs | 2 + .../DbMethods/DefaultDbMethod.cs | 38 ++++- .../ExpressionsToSql/DbMethods/IDbMethods.cs | 3 + .../ExpressionsToSql/DbMethods/SqlFunc.cs | 9 ++ .../ResolveItems/LambdaExpressionResolve.cs | 3 + .../ResolveItems/MemberExpressionResolve.cs | 140 ++++++++++-------- .../MethodCallExpressionResolve.cs | 42 +++++- .../ResolveItems/NewExpressionResolve.cs | 1 + .../ExpressionsToSql/Subquery/Items/SubAvg.cs | 44 ++++++ .../ExpressionsToSql/Subquery/Items/SubSum.cs | 44 ++++++ .../ExpressionsToSql/Subquery/SubTools.cs | 2 + .../ExpressionsToSql/Subquery/Subquerable.cs | 46 +++++- .../SqlSugar/Infrastructure/ContextMethods.cs | 35 ++++- .../Infrastructure/DependencyManagement.cs | 2 +- .../SqlBuilder/MySqlExpressionContext.cs | 10 ++ .../Realization/Oracle/DbBind/OracleDbBind.cs | 8 +- .../SqlBuilder/OracleExpressionContext.cs | 17 +++ .../Oracle/SqlBuilder/OracleInsertBuilder.cs | 5 + .../Oracle/SqlBuilder/OracleUpdateBuilder.cs | 31 +++- .../Oracle/Updateable/OracleUpdateable.cs | 5 + .../SqlBuilder/SqliteExpressionContext.cs | 12 ++ .../Sqlite/SqlBuilder/SqliteInsertBuilder.cs | 5 + .../Sqlite/SqlBuilder/SqliteUpdateBuilder.cs | 5 + .../SqliteTest/DataBase/SqlSugar4xTest.sqlite | Bin 241664 -> 241664 bytes 32 files changed, 539 insertions(+), 88 deletions(-) create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs create mode 100644 Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index 7fe1fe2c0..7db20d88f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -18,16 +18,14 @@ namespace SqlSugar public virtual string GetDbTypeName(string csharpTypeName) { if (csharpTypeName == UtilConstants.ByteArrayType.Name) - { return "varbinary"; - } - if (csharpTypeName == "Int32") + if (csharpTypeName.ToLower() == "int32") csharpTypeName = "int"; - if (csharpTypeName == "Int16") + if (csharpTypeName.ToLower() == "int16") csharpTypeName = "short"; - if (csharpTypeName == "Int64") + if (csharpTypeName.ToLower() == "int64") csharpTypeName = "long"; - if (csharpTypeName == "Boolean") + if (csharpTypeName.ToLower().IsIn("boolean", "bool")) csharpTypeName = "bool"; var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)); return mappings.HasValue() ? mappings.First().Key : "varchar"; @@ -151,7 +149,7 @@ namespace SqlSugar { return "long"; } - else if (dbTypeName == "int16") + else if (dbTypeName == "int16") { return "short"; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 1cf4e2fb8..4c8ad3757 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -222,7 +222,7 @@ namespace SqlSugar if (bindProperyTypeName.IsContainsIn("int", "int32")) method = isNullableType ? getConvertInt32 : getInt32; if (bindProperyTypeName.IsContainsIn("int64")) - method = isNullableType ? getConvertInt64 : getInt64; + method = isNullableType ? getConvertInt32 : getInt32; if (bindProperyTypeName.IsContainsIn("byte")) method = isNullableType ? getConvertByte : getByte; if (bindProperyTypeName.IsContainsIn("int16")) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs index 0fcb158a2..82e92a3ea 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs @@ -166,6 +166,11 @@ namespace SqlSugar } return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type.IsEnum()) { return Convert.ToInt64(value); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs index 692f1b064..dbaf3fbdc 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/UpdateBuilder.cs @@ -175,7 +175,7 @@ namespace SqlSugar { updateTable.Append(SqlTemplateBatchUnion); } - updateTable.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value),Builder.GetTranslationColumnName(it.DbColumnName))))); + updateTable.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value), Builder.GetTranslationColumnName(it.DbColumnName))))); ++i; } pageIndex++; @@ -210,7 +210,7 @@ namespace SqlSugar { if (SetValues.IsValuable()) { - var setValue = SetValues.Where(sv => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName)|| sv.Key==Builder.GetTranslationColumnName(it.PropertyName)); + var setValue = SetValues.Where(sv => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName) || sv.Key == Builder.GetTranslationColumnName(it.PropertyName)); if (setValue != null && setValue.Any()) { return setValue.First().Value; @@ -259,6 +259,11 @@ namespace SqlSugar } return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type.IsEnum()) { return Convert.ToInt64(value); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/ConditionalType.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/ConditionalType.cs index 2a4a691b5..d316c0a90 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/ConditionalType.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Enum/ConditionalType.cs @@ -12,6 +12,12 @@ namespace SqlSugar GreaterThan =2, GreaterThanOrEqual = 3, LessThan=4, - LessThanOrEqual = 5 + LessThanOrEqual = 5, + In=6, + NotIn=7, + LikeLeft=8, + LikeRight=9, + NoEqual=10, + IsNullOrEmpty=11 } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs new file mode 100644 index 000000000..3e74788e5 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class CaseWhen + { + public CaseThen ElseIF(bool condition) + { + return null; + } + public T End(T defaultValue) + { + return default(T); + } + } + public class CaseThen + { + + public CaseWhen Return(T result) + { + return null; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs new file mode 100644 index 000000000..94b92c39d --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + + public class CaseWhenResolve + { + List allMethods = new List(); + private ExpressionContext context = null; + public CaseWhenResolve(MethodCallExpression expression, ExpressionContext context, Expression oppsiteExpression) + { + this.context = context; + var currentExpression = expression; + allMethods.Add(currentExpression); + if (context.IsSingle && oppsiteExpression != null&& oppsiteExpression is MemberExpression) + { + var childExpression = (oppsiteExpression as MemberExpression).Expression; + this.context.SingleTableNameSubqueryShortName = (childExpression as ParameterExpression).Name; + } + else if (context.IsSingle) + { + this.context.SingleTableNameSubqueryShortName = (context.Expression as LambdaExpression).Parameters.First().Name; + } + while (currentExpression != null) + { + var addItem = currentExpression.Object as MethodCallExpression; + if (addItem != null) + allMethods.Add(addItem); + currentExpression = addItem; + } + } + + public string GetSql() + { + allMethods.Reverse(); + List> sqls = new List>(); + foreach (var methodExp in allMethods) + { + var isFirst = allMethods.First() == methodExp; + var isLast= allMethods.Last() == methodExp; + var sql= SubTools.GetMethodValue(this.context, methodExp.Arguments[0],this.context.IsSingle?ResolveExpressType.WhereSingle:ResolveExpressType.WhereMultiple); + sqls.Add(new KeyValuePair(methodExp.Method.Name, sql)); + } + var result= this.context.DbMehtods.CaseWhen(sqls); + return result; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ErrorMessage.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ErrorMessage.cs index b64176e27..fe73cb1e0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ErrorMessage.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ErrorMessage.cs @@ -34,7 +34,7 @@ namespace SqlSugar { get { - return ErrorMessage.GetThrowMessage("Connection open error . {0}", " 连接字符串出错了,实在找不到原因请先Google错误{0}."); + return ErrorMessage.GetThrowMessage("Connection open error . {0}", " 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,实在找不到原因请先Google错误信息:{0}."); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index fae3ce837..09778df27 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -41,6 +41,8 @@ namespace SqlSugar case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: return "*"; + case ExpressionType.Coalesce: + throw new Exception("Expression no support ?? ,Use SqlFunc.IsNull"); default: Check.ThrowNotSupportedException(string.Format(ErrorMessage.OperatorError, expressiontype.ToString())); return null; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs index bdfc85e6a..6b0624d93 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs @@ -271,6 +271,13 @@ namespace SqlSugar return string.Format("{0}", parameter1.MemberValue); } + public virtual string IsNull(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter1 = model.Args[1]; + return string.Format("ISNULL({0},{1})", parameter.MemberName, parameter1.MemberName); + } + public virtual string True() { return "( 1 = 1 ) "; @@ -295,7 +302,7 @@ namespace SqlSugar public virtual string MergeString(params string[] strings) { - return string.Join("", strings); + return string.Join("+", strings); } public virtual string Pack(string sql) @@ -312,5 +319,34 @@ namespace SqlSugar { return "NULL"; } + + public virtual string GetDate() + { + return "GETDATE()"; + } + + public virtual string CaseWhen(List> sqls) + { + StringBuilder reslut = new StringBuilder(); + foreach (var item in sqls) + { + if (item.Key == "IF") + { + reslut.AppendFormat(" ( CASE WHEN {0} ", item.Value); + } + else if (item.Key == "End") + { + reslut.AppendFormat("ELSE {0} END )", item.Value); + } + else if (item.Key == "Return") + { + reslut.AppendFormat(" THEN {0} ", item.Value); + } + else { + reslut.AppendFormat(" WHEN {0} ", item.Value); + } + } + return reslut.ToString(); + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs index 1246de45f..0e800a6ef 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs @@ -36,6 +36,7 @@ namespace SqlSugar string ToGuid(MethodCallExpressionModel model); string ToDouble(MethodCallExpressionModel model); string ToBool(MethodCallExpressionModel model); + string CaseWhen(List> sqls); string Substring(MethodCallExpressionModel model); string ToDate(MethodCallExpressionModel model); string ToTime(MethodCallExpressionModel model); @@ -48,6 +49,7 @@ namespace SqlSugar string AggregateMax(MethodCallExpressionModel model); string AggregateCount(MethodCallExpressionModel model); string MappingColumn(MethodCallExpressionModel model); + string IsNull(MethodCallExpressionModel model); string GetSelfAndAutoFill(string shortName,bool isSingle); string True(); string False(); @@ -56,5 +58,6 @@ namespace SqlSugar string EqualTrue(string value); string Pack(string sql); string Null(); + string GetDate(); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs index 463fd2867..8d68265aa 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs @@ -67,6 +67,13 @@ namespace SqlSugar public static int DateValue(DateTime date, DateType dataType) { throw new NotSupportedException("Can only be used in expressions"); } public static bool Between(object value, object start, object end) { throw new NotSupportedException("Can only be used in expressions"); } public static TResult IIF(bool Expression, TResult thenValue, TResult elseValue) { throw new NotSupportedException("Can only be used in expressions"); } + public static TResult IsNull(TResult thisValue, TResult ifNullValue) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1,string value2) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1, string value2,string value3) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1, string value2,string value3,string value4) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1, string value2, string value3, string value4,string value5) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1, string value2, string value3, string value4, string value5,string value6) { throw new NotSupportedException("Can only be used in expressions"); } + public static string MergeString(string value1, string value2, string value3, string value4, string value5, string value6,string value7) { throw new NotSupportedException("Can only be used in expressions"); } public static int ToInt32(object value) { return value.ObjToInt(); } public static long ToInt64(object value) { return Convert.ToInt64(value); } /// @@ -102,11 +109,13 @@ namespace SqlSugar /// /// public static TResult GetSelfAndAutoFill(TResult value) { throw new NotSupportedException("Can only be used in expressions"); } + public static DateTime GetDate() { throw new NotSupportedException("Can only be used in expressions"); } /// /// Subquery /// /// /// public static Subqueryable Subqueryable() where T:class,new(){ throw new NotSupportedException("Can only be used in expressions");} + public static CaseThen IF(bool condition) { throw new NotSupportedException("Can only be used in expressions"); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/LambdaExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/LambdaExpressionResolve.cs index 9023cf3f6..fa63291dc 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/LambdaExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/LambdaExpressionResolve.cs @@ -12,6 +12,9 @@ namespace SqlSugar LambdaExpression lambda = base.Expression as LambdaExpression; var expression = lambda.Body; base.Expression = expression; + if (parameter.Context.ResolveType.IsIn(ResolveExpressType.FieldMultiple, ResolveExpressType.FieldSingle)) { + parameter.CommonTempData = CommonTempDataType.Append; + } base.Start(); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs index 1866f8abb..1696abd80 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs @@ -10,24 +10,11 @@ namespace SqlSugar public ExpressionParameter Parameter { get; set; } public MemberExpressionResolve(ExpressionParameter parameter) : base(parameter) { - var baseParameter = parameter.BaseParameter; - var expression = base.Expression as MemberExpression; - var childExpression = expression.Expression as MemberExpression; - var memberName = expression.Member.Name; - var childIsMember = childExpression != null; - var isLeft = parameter.IsLeft; - var isSetTempData = parameter.IsSetTempData; - var isValue = memberName == "Value" && expression.Member.DeclaringType.Name == "Nullable`1"; - var isBool = expression.Type == UtilConstants.BoolType; - var isValueBool = isValue && isBool && parameter.BaseExpression == null; - var isLength = memberName == "Length" && childIsMember && childExpression.Type == UtilConstants.StringType; - var isDateValue = memberName.IsIn(Enum.GetNames(typeof(DateType))) && (childIsMember && childExpression.Type == UtilConstants.DateType); - var isLogicOperator = ExpressionTool.IsLogicOperator(baseParameter.OperatorValue) || baseParameter.OperatorValue.IsNullOrEmpty(); - var isHasValue = isLogicOperator && memberName == "HasValue" && expression.Expression != null && expression.NodeType == ExpressionType.MemberAccess; - var isDateDate = memberName == "Date" && expression.Expression.Type == UtilConstants.DateType; - var isMemberValue = expression.Expression != null && expression.Expression.NodeType != ExpressionType.Parameter && !isValueBool; - var isSingle = parameter.Context.ResolveType == ResolveExpressType.WhereSingle; - var fieldIsBool = isBool && isLogicOperator&&(parameter.BaseParameter==null||!(parameter.BaseParameter.CurrentExpression is MemberInitExpression|| parameter.BaseParameter.CurrentExpression is NewExpression)); + ExpressionParameter baseParameter; + MemberExpression expression; + bool? isLeft; + bool isSetTempData, isValue, isValueBool, isLength, isDateValue, isHasValue, isDateDate, isMemberValue, isSingle, fieldIsBool, isSelectField, isField; + SettingParameters(parameter, out baseParameter, out expression, out isLeft, out isSetTempData, out isValue, out isValueBool, out isLength, out isDateValue, out isHasValue, out isDateDate, out isMemberValue, out isSingle, out fieldIsBool, out isSelectField, out isField); baseParameter.ChildExpression = expression; if (isLength) { @@ -57,52 +44,60 @@ namespace SqlSugar { ResolveMemberValue(parameter, baseParameter, isLeft, isSetTempData, expression); } - else if (fieldIsBool&& !this.Context.ResolveType.IsIn(ResolveExpressType.FieldSingle, ResolveExpressType.FieldMultiple)) + else if (fieldIsBool && !isField && !isSelectField) { ResolvefieldIsBool(parameter, baseParameter, isLeft, isSetTempData, expression, isSingle); } else { - string fieldName = string.Empty; - switch (parameter.Context.ResolveType) - { - case ResolveExpressType.SelectSingle: - fieldName = GetSingleName(parameter, expression, isLeft); - if (isSetTempData) - baseParameter.CommonTempData = fieldName; - else - base.Context.Result.Append(fieldName); - break; - case ResolveExpressType.SelectMultiple: - fieldName = GetMultipleName(parameter, expression, isLeft); - if (isSetTempData) - baseParameter.CommonTempData = fieldName; - else - base.Context.Result.Append(fieldName); - break; - case ResolveExpressType.WhereSingle: - case ResolveExpressType.WhereMultiple: - ResolveWhereLogic(parameter, baseParameter, expression, isLeft, isSetTempData, isSingle); - break; - case ResolveExpressType.FieldSingle: - fieldName = GetSingleName(parameter, expression, isLeft); - base.Context.Result.Append(fieldName); - break; - case ResolveExpressType.FieldMultiple: - fieldName = GetMultipleName(parameter, expression, isLeft); - base.Context.Result.Append(fieldName); - break; - case ResolveExpressType.ArrayMultiple: - case ResolveExpressType.ArraySingle: - fieldName = GetName(parameter, expression, isLeft, parameter.Context.ResolveType == ResolveExpressType.ArraySingle); - base.Context.Result.Append(fieldName); - break; - default: - break; - } + ResolveDefault(parameter, baseParameter, expression, isLeft, isSetTempData, isSingle); } } + #region Resolve default + private void ResolveDefault(ExpressionParameter parameter, ExpressionParameter baseParameter, MemberExpression expression, bool? isLeft, bool isSetTempData, bool isSingle) + { + string fieldName = string.Empty; + switch (parameter.Context.ResolveType) + { + case ResolveExpressType.SelectSingle: + fieldName = GetSingleName(parameter, expression, isLeft); + if (isSetTempData) + baseParameter.CommonTempData = fieldName; + else + base.Context.Result.Append(fieldName); + break; + case ResolveExpressType.SelectMultiple: + fieldName = GetMultipleName(parameter, expression, isLeft); + if (isSetTempData) + baseParameter.CommonTempData = fieldName; + else + base.Context.Result.Append(fieldName); + break; + case ResolveExpressType.WhereSingle: + case ResolveExpressType.WhereMultiple: + ResolveWhereLogic(parameter, baseParameter, expression, isLeft, isSetTempData, isSingle); + break; + case ResolveExpressType.FieldSingle: + fieldName = GetSingleName(parameter, expression, isLeft); + base.Context.Result.Append(fieldName); + break; + case ResolveExpressType.FieldMultiple: + fieldName = GetMultipleName(parameter, expression, isLeft); + base.Context.Result.Append(fieldName); + break; + case ResolveExpressType.ArrayMultiple: + case ResolveExpressType.ArraySingle: + fieldName = GetName(parameter, expression, isLeft, parameter.Context.ResolveType == ResolveExpressType.ArraySingle); + base.Context.Result.Append(fieldName); + break; + default: + break; + } + } + + #endregion + #region Resolve Where private void ResolveWhereLogic(ExpressionParameter parameter, ExpressionParameter baseParameter, MemberExpression expression, bool? isLeft, bool isSetTempData, bool isSingle) { @@ -112,7 +107,7 @@ namespace SqlSugar if (ExpressionTool.IsConstExpression(expression)) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); - base.AppendValue(parameter, isLeft, value); + baseParameter.CommonTempData = value; } else { @@ -204,9 +199,9 @@ namespace SqlSugar }; AppendMember(parameter, isLeft, GetToDate(this.Context.DbMehtods.MergeString( this.GetDateValue(parameter.CommonTempData, DateType.Year), - "+'-'+", + "'-'", this.GetDateValue(parameter.CommonTempData, DateType.Month), - "+'-'+", + "'-'", this.GetDateValue(parameter.CommonTempData, DateType.Day)))); } parameter.CommonTempData = oldCommonTempDate; @@ -344,6 +339,33 @@ namespace SqlSugar }; return this.Context.DbMehtods.ToDate(pars); } + + private void SettingParameters(ExpressionParameter parameter, out ExpressionParameter baseParameter, out MemberExpression expression, out bool? isLeft, out bool isSetTempData, out bool isValue, out bool isValueBool, out bool isLength, out bool isDateValue, out bool isHasValue, out bool isDateDate, out bool isMemberValue, out bool isSingle, out bool fieldIsBool, out bool isSelectField, out bool isField) + { + baseParameter = parameter.BaseParameter; + expression = base.Expression as MemberExpression; + var childExpression = expression.Expression as MemberExpression; + var memberName = expression.Member.Name; + var childIsMember = childExpression != null; + var isRoot = parameter.BaseExpression == null; + isLeft = parameter.IsLeft; + isSetTempData = parameter.IsSetTempData; + isValue = memberName == "Value" && expression.Member.DeclaringType.Name == "Nullable`1"; + var isBool = expression.Type == UtilConstants.BoolType; + isValueBool = isValue && isBool && isRoot; + isLength = memberName == "Length" && childIsMember && childExpression.Type == UtilConstants.StringType; + isDateValue = memberName.IsIn(Enum.GetNames(typeof(DateType))) && (childIsMember && childExpression.Type == UtilConstants.DateType); + var isLogicOperator = ExpressionTool.IsLogicOperator(baseParameter.OperatorValue) || baseParameter.OperatorValue.IsNullOrEmpty(); + isHasValue = isLogicOperator && memberName == "HasValue" && expression.Expression != null && expression.NodeType == ExpressionType.MemberAccess; + isDateDate = memberName == "Date" && expression.Expression.Type == UtilConstants.DateType; + isMemberValue = expression.Expression != null && expression.Expression.NodeType != ExpressionType.Parameter && !isValueBool; + isSingle = parameter.Context.ResolveType == ResolveExpressType.WhereSingle; + fieldIsBool = isBool && isLogicOperator && (parameter.BaseParameter == null || !(parameter.BaseParameter.CurrentExpression is MemberInitExpression || parameter.BaseParameter.CurrentExpression is NewExpression)); + var isSelect = this.Context.ResolveType.IsIn(ResolveExpressType.SelectSingle, ResolveExpressType.SelectMultiple); + isSelectField = isSelect && isRoot; + isField = this.Context.ResolveType.IsIn(ResolveExpressType.FieldSingle, ResolveExpressType.FieldMultiple); + } + #endregion } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index e1f8be3f1..00dcd94aa 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -45,7 +45,20 @@ namespace SqlSugar //Check.Exception(!(parameter.BaseExpression is BinaryExpression), "Current expressions are not supported"); SubResolve subResolve = new SubResolve(express, this.Context, parameter.OppsiteExpression); var appendSql = subResolve.GetSql(); - if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple,ResolveExpressType.SelectSingle)) + if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle)) + { + parameter.BaseParameter.CommonTempData = appendSql; + } + else + { + base.AppendValue(parameter, isLeft, appendSql); + } + return; + } + 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)) { parameter.BaseParameter.CommonTempData = appendSql; } @@ -70,6 +83,14 @@ namespace SqlSugar } } + private bool IsIfElse(MethodCallExpression express, string methodName) + { + if (methodName == "End"&& express.Object.Type==typeof(CaseWhen)) + return true; + else + return false; + } + private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) { CheckMethod(express); @@ -176,6 +197,13 @@ namespace SqlSugar model.Args.AddRange(appendArgs); } var methodValue = GetMdthodValue(name, model); + if (parameter.BaseExpression is BinaryExpression && parameter.OppsiteExpression.Type == UtilConstants.BoolType&&name=="HasValue") { + methodValue = this.Context.DbMehtods.CaseWhen(new List>() { + new KeyValuePair("IF",methodValue.ObjToString()), + new KeyValuePair("Return","1"), + new KeyValuePair("End","0") + }); + } base.AppendValue(parameter, isLeft, methodValue); } @@ -284,7 +312,7 @@ namespace SqlSugar base.Start(); var methodCallExpressionArgs = new MethodCallExpressionArgs() { - IsMember = parameter.ChildExpression is MemberExpression&&!ExpressionTool.IsConstExpression(parameter.ChildExpression as MemberExpression), + IsMember = parameter.ChildExpression is MemberExpression && !ExpressionTool.IsConstExpression(parameter.ChildExpression as MemberExpression), MemberName = parameter.CommonTempData }; if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now") @@ -407,9 +435,15 @@ namespace SqlSugar 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; } @@ -450,12 +484,12 @@ namespace SqlSugar { "AddMilliseconds",DateType.Millisecond} }; - private bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod) + private bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod) { return !isValidNativeMethod && express.Method.DeclaringType.Namespace.IsIn("System.Linq", "System.Collections.Generic") && methodName == "Contains"; } - private bool IsSubMethod(MethodCallExpression express, string methodName) + private bool IsSubMethod(MethodCallExpression express, string methodName) { return SubTools.SubItemsConst.Any(it => it.Name == methodName) && express.Object != null && express.Object.Type.Name == "Subqueryable`1"; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs index 9c2e224b6..55f4c6566 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs @@ -13,6 +13,7 @@ namespace SqlSugar public NewExpressionResolve(ExpressionParameter parameter) : base(parameter) { var expression = base.Expression as NewExpression; + Check.Exception(expression.Type == UtilConstants.GuidType, "Not Support new Guid(), Use Guid.New()"); switch (parameter.Context.ResolveType) { case ResolveExpressType.WhereSingle: diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs new file mode 100644 index 000000000..22daab138 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubAvg: ISubOperation + { + public string Name + { + get + { + return "Avg"; + } + } + + public Expression Expression + { + get; set; + } + + + public int Sort + { + get + { + return 200; + } + } + + public ExpressionContext Context + { + get; set; + } + + public string GetValue(Expression expression = null) + { + var exp = expression as MethodCallExpression; + return "AVG(" + SubTools.GetMethodValue(this.Context, exp.Arguments[0], ResolveExpressType.FieldSingle) + ")"; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs new file mode 100644 index 000000000..16563bba8 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubSum:ISubOperation + { + public string Name + { + get + { + return "Sum"; + } + } + + public Expression Expression + { + get; set; + } + + + public int Sort + { + get + { + return 200; + } + } + + public ExpressionContext Context + { + get; set; + } + + public string GetValue(Expression expression = null) + { + var exp = expression as MethodCallExpression; + return "SUM("+SubTools.GetMethodValue(this.Context, exp.Arguments[0], ResolveExpressType.FieldSingle)+")"; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index 9697a03f0..d2aa6d923 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -23,6 +23,8 @@ namespace SqlSugar new SubCount(){ Context=Context }, new SubMax(){ Context=Context }, new SubMin(){ Context=Context }, + new SubSum(){ Context=Context }, + new SubAvg(){ Context=Context }, new SubOrderBy(){ Context=Context }, new SubOrderByDesc(){ Context=Context } }; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs index 819c7b944..3be1178c1 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs @@ -21,10 +21,15 @@ namespace SqlSugar { return this; } + public TResult Select(Func expression) where TResult :struct { return default(TResult); } + public Byte[] Select(Func expression) + { + return null; + } public string Select(Func expression) { return default(string); @@ -34,19 +39,54 @@ namespace SqlSugar { return default(TResult); } - - public TResult Min(Func expression) where TResult : struct + public Byte[] Max(Func expression) { - return default(TResult); + return null; } public string Max(Func expression) { return default(string); } + public string Min(Func expression) { return default(string); } + public TResult Min(Func expression) where TResult : struct + { + return default(TResult); + } + public Byte[] Min(Func expression) + { + return null; + } + + + public string Sum(Func expression) + { + return default(string); + } + public TResult Sum(Func expression) where TResult : struct + { + return default(TResult); + } + public Byte[] Sum(Func expression) + { + return null; + } + + public string Avg(Func expression) + { + return default(string); + } + public TResult Avg(Func expression) where TResult : struct + { + return default(TResult); + } + public Byte[] Avg(Func expression) + { + return null; + } public bool Any() { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs index 7a1eb51f3..ed8402b80 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs @@ -140,12 +140,9 @@ namespace SqlSugar addValue = null; } } - else + else if (item.PropertyType == UtilConstants.IntType) { - if (item.PropertyType == UtilConstants.IntType) - { - addValue = Convert.ToInt32(addValue); - } + addValue = Convert.ToInt32(addValue); } result.Add(name, addValue); } @@ -330,6 +327,34 @@ namespace SqlSugar builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<=", parameterName); parameters.Add(new SugarParameter(parameterName, item.FieldValue)); break; + case ConditionalType.In: + if (item.FieldValue == null) item.FieldValue = string.Empty; + var inValue1 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")"); + builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "IN", inValue1); + parameters.Add(new SugarParameter(parameterName, item.FieldValue)); + break; + case ConditionalType.NotIn: + if (item.FieldValue == null) item.FieldValue = string.Empty; + var inValue2 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")"); + builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "NOT IN", inValue2); + parameters.Add(new SugarParameter(parameterName, item.FieldValue)); + break; + case ConditionalType.LikeLeft: + builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName); + parameters.Add(new SugarParameter(parameterName, item.FieldValue + "%")); + break; + case ConditionalType.LikeRight: + builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName); + parameters.Add(new SugarParameter(parameterName, "%" + item.FieldValue)); + break; + case ConditionalType.NoEqual: + builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName); + parameters.Add(new SugarParameter(parameterName, item.FieldValue)); + break; + case ConditionalType.IsNullOrEmpty: + builder.AppendFormat("{0} ({1}) OR ({2}) ", type, item.FieldName.ToSqlFilter() + " IS NULL ", item.FieldName.ToSqlFilter() + " = '' "); + parameters.Add(new SugarParameter(parameterName, item.FieldValue)); + break; default: break; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs index b638424ff..c6ccd3849 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs @@ -84,7 +84,7 @@ namespace SqlSugar { var message = ErrorMessage.GetThrowMessage( "You need to refer to Microsoft.Data.Sqlite." + ex.Message, - "你需要引用System.Data.SQLite.dll,如果有版本兼容问题请先删除原有引用"); + "你需要引用Microsoft.Data.Sqlite,如果有版本兼容问题请先删除原有引用"); throw new Exception(message); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs index 64a41861d..879bba742 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/MySql/SqlBuilder/MySqlExpressionContext.cs @@ -123,5 +123,15 @@ namespace SqlSugar { return " concat("+string.Join(",", strings).Replace("+", "") + ") "; } + public override string IsNull(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter1 = model.Args[1]; + return string.Format("IFNULL({0},{1})", parameter.MemberName, parameter1.MemberName); + } + public override string GetDate() + { + return "NOW()"; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs index d6d827913..78010f067 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs @@ -9,7 +9,7 @@ namespace SqlSugar public override string GetPropertyTypeName(string dbTypeName) { dbTypeName = dbTypeName.ToLower(); - var propertyTypes = MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName||it.Key.ToLower()== dbTypeName); + var propertyTypes = MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName || it.Key.ToLower() == dbTypeName); if (dbTypeName == "int32") { return "int"; @@ -30,6 +30,10 @@ namespace SqlSugar { return "string"; } + if (dbTypeName == "byte[]") + { + return "byte[]"; + } else if (propertyTypes == null || propertyTypes.Count() == 0) { Check.ThrowNotSupportedException(string.Format(" \"{0}\" Type NotSupported, DbBindProvider.GetPropertyTypeName error.", dbTypeName)); @@ -75,7 +79,7 @@ namespace SqlSugar new KeyValuePair("clob",CSharpDataType.@string), new KeyValuePair("long",CSharpDataType.@string), new KeyValuePair("nclob",CSharpDataType.@string), - new KeyValuePair("rowid",CSharpDataType.@string), + new KeyValuePair("rowid",CSharpDataType.@string), new KeyValuePair("date",CSharpDataType.DateTime), new KeyValuePair("timestamp",CSharpDataType.DateTime), diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs index 4ed6716a4..a43964aeb 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -156,5 +156,22 @@ namespace SqlSugar var parameter = model.Args[0]; return string.Format(" LENGTH({0}) ", parameter.MemberName); } + + public override string IsNull(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter1 = model.Args[1]; + return string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName); + } + + public override string MergeString(params string[] strings) + { + return string.Join("||", strings).Replace("+", ""); + } + + public override string GetDate() + { + return "sysdate"; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs index d6eb4e8f6..8e9c19b15 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs @@ -109,6 +109,11 @@ namespace SqlSugar { return Convert.ToInt64(value); } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type == UtilConstants.BoolType) { return value.ObjToBool() ? "1" : "0"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs index 242d87074..ecb817b2f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -10,8 +10,32 @@ namespace SqlSugar { protected override string TomultipleSqlString(List> groupList) { - throw new NotSupportedException("Oracle Waiting for updates updateable(List)"); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("Begin"); + sb.AppendLine(string.Join("\r\n", groupList.Select(t => + { + var updateTable = string.Format("UPDATE {0} SET", base.GetTableNameStringNoWith); + var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Select(m => GetOracleUpdateColums(m)).ToArray()); + var pkList = t.Where(s => s.IsPrimarykey).ToList(); + List whereList = new List(); + foreach (var item in pkList) + { + var isFirst = pkList.First() == item; + var whereString = isFirst ? " " : " AND "; + whereString += GetOracleUpdateColums(item); + whereList.Add(whereString); + } + return string.Format("{0} {1} WHERE {2};", updateTable, setValues, string.Join("AND",whereList)); + }).ToArray())); + sb.AppendLine("End;"); + return sb.ToString(); } + + private string GetOracleUpdateColums(DbColumnInfo m) + { + return string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(), FormatValue(m.Value)); + } + public override object FormatValue(object value) { if (value == null) @@ -34,6 +58,11 @@ namespace SqlSugar { return Convert.ToInt64(value); } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type == UtilConstants.BoolType) { return value.ObjToBool() ? "1" : "0"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs index 1bbf8cf25..60b34b553 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs @@ -11,5 +11,10 @@ namespace SqlSugar { return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.DbColumnName).ToList(); } + public override int ExecuteCommand() + { + base.ExecuteCommand(); + return base.UpdateObjs.Count(); + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs index a925e1deb..f8844eba8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs @@ -196,5 +196,17 @@ namespace SqlSugar { return string.Join("||", strings).Replace("+",""); } + + public override string IsNull(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter1 = model.Args[1]; + return string.Format("IFNULL({0},{1})", parameter.MemberName, parameter1.MemberName); + } + + public override string GetDate() + { + return "DATETIME('now')"; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs index 3db3f7366..8a9e37272 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs @@ -56,6 +56,11 @@ namespace SqlSugar { return Convert.ToInt64(value); } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type == UtilConstants.BoolType) { return value.ObjToBool() ? "1" : "0"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs index 029538073..3b3c64cae 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs @@ -54,6 +54,11 @@ namespace SqlSugar { return Convert.ToInt64(value); } + else if (type == UtilConstants.ByteArrayType) + { + string bytesString = "0x" + BitConverter.ToString((byte[])value); + return bytesString; + } else if (type == UtilConstants.BoolType) { return value.ObjToBool() ? "1" : "0"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite index 9701e8a70c1828acb26adf8fb40734c20035df8d..a9088fff8c1042768214ff8c32a0362884c71724 100644 GIT binary patch literal 241664 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 Al>h($ literal 241664 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 PUih#6fq3En-9PYu&?MRh