From ebe0a7b31bc21024a2f56b74a397389a9674dc4f Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 23 Mar 2022 10:32:39 +0800 Subject: [PATCH] Support (date1-date2).ToTalDays hours minutes --- .../SqlServerTest/SqlServerTest.csproj | 1 + Src/Asp.Net/SqlServerTest/UnitTest/Main.cs | 1 + .../SqlServerTest/UnitTest/UCustom011.cs | 32 +++++++++++ .../ResolveItems/MemberExpressionResolve.cs | 53 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 Src/Asp.Net/SqlServerTest/UnitTest/UCustom011.cs diff --git a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj index dfe75fe19..9a0d4c3b3 100644 --- a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj +++ b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj @@ -100,6 +100,7 @@ + diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/Main.cs b/Src/Asp.Net/SqlServerTest/UnitTest/Main.cs index 83c537dd6..d7a5ae348 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/Main.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/Main.cs @@ -31,6 +31,7 @@ namespace OrmTest } public static void Init() { + UCustom011.Init(); UCustom010.Init(); UCustom08.Init(); UCustom07.Init(); diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom011.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom011.cs new file mode 100644 index 000000000..4766376f9 --- /dev/null +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom011.cs @@ -0,0 +1,32 @@ +using OrmTest.UnitTest.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest +{ + public class UCustom011 + { + public static void Init() + { + var db = NewUnitTest.Db; + db.Queryable().Where(it => (it.CreateTime - SqlFunc.GetDate()).TotalDays > 1).ToList(); + var x1=db.Queryable().Select(it => (DateTime.Now - SqlFunc.GetDate().AddYears(-1)).TotalDays).ToList(); + var x2 = db.Queryable().Select(it => (DateTime.Now - SqlFunc.GetDate().AddDays(-1)).TotalHours).ToList(); + var x3 = db.Queryable().Select(it => (DateTime.Now - SqlFunc.GetDate().AddHours(-1)).TotalMinutes).ToList(); + var x4 = db.Queryable().Select(it => (DateTime.Now - SqlFunc.GetDate().AddMinutes(-1)).TotalSeconds).ToList(); + if (x1.Any()) + { + Check.Exception(x1.First()!=365, "unit error . UCustom011"); + Check.Exception(x2.First() != 24, "unit error . UCustom011"); + Check.Exception(x3.First() != 60, "unit error . UCustom011"); + Check.Exception(x4.First() != 60, "unit error . UCustom011"); + } + } + + + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs index 762ad62ed..a950234ea 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs @@ -20,6 +20,10 @@ namespace SqlSugar { ResolveLength(parameter, isLeft, expression); } + else if (IsDateDiff(expression)) + { + ResolveDateDiff(parameter, isLeft, expression); + } else if (isHasValue) { ResolveHasValue(parameter, expression); @@ -63,6 +67,7 @@ namespace SqlSugar } + #region Resolve default private void ResolveDefault(ExpressionParameter parameter, ExpressionParameter baseParameter, MemberExpression expression, bool? isLeft, bool isSetTempData, bool isSingle) { @@ -207,6 +212,43 @@ namespace SqlSugar #endregion #region Resolve special member + private void ResolveDateDiff(ExpressionParameter parameter, bool? isLeft, MemberExpression expression) + { + var binaryExp=expression.Expression as BinaryExpression; + var beginExp = binaryExp.Right; + var endExp = binaryExp.Left; + + var dateType = DateType.Day; + var begin = GetNewExpressionValue(beginExp); + var end = GetNewExpressionValue(endExp); + + foreach (var item in UtilMethods.EnumToDictionary()) + { + if (expression.Member.Name.ToLower().Contains(item.Key.ToLower())) + { + dateType = item.Value; + break; + } + } + var result = this.Context.DbMehtods.DateDiff(new MethodCallExpressionModel() + { + Args = new List() { + new MethodCallExpressionArgs(){ + MemberName=dateType, + MemberValue=dateType + }, + new MethodCallExpressionArgs(){ + MemberName=begin, + MemberValue=begin + }, + new MethodCallExpressionArgs(){ + MemberName=end, + MemberValue=end + } + } + }); ; + base.AppendMember(parameter, isLeft, result); + } private void ResolveDateDateByCall(ExpressionParameter parameter, bool? isLeft, MemberExpression expression) { var value = GetNewExpressionValue(expression.Expression); @@ -441,6 +483,17 @@ namespace SqlSugar #endregion #region Helper + private static bool IsDateDiff(MemberExpression expression) + { + return + expression.Expression!=null&& + expression.Expression is BinaryExpression && + expression.Expression.Type == UtilConstants.TimeSpanType&& + expression.Member.Name.StartsWith("Total")&& + expression.Member.Name.EndsWith("s") + ; + } + private string AppendMember(ExpressionParameter parameter, bool? isLeft, string fieldName) { if (parameter.BaseExpression is BinaryExpression || (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Append)))