1+ using RepoDb . Enumerations ;
2+ using RepoDb . Exceptions ;
3+ using RepoDb . Extensions ;
4+ using RepoDb . Interfaces ;
5+ using RepoDb . Resolvers ;
16using System ;
27using System . Collections . Generic ;
38using System . Data ;
49using System . Data . Common ;
510using System . Linq ;
611using System . Linq . Expressions ;
712using System . Reflection ;
8- using RepoDb . Enumerations ;
9- using RepoDb . Exceptions ;
10- using RepoDb . Extensions ;
11- using RepoDb . Interfaces ;
12- using RepoDb . Resolvers ;
1313
1414namespace RepoDb . Reflection
1515{
@@ -510,7 +510,15 @@ internal static MethodInfo GetDateTimeTimeOfDayPropertyGetMethod() =>
510510 /// <returns></returns>
511511 internal static MethodInfo GetDateOnlyFromDateTimeStaticMethod ( ) =>
512512 StaticType . DateOnly . GetMethod ( "FromDateTime" ) ;
513+
514+ /// <summary>
515+ ///
516+ /// </summary>
517+ /// <returns></returns>
518+ internal static MethodInfo GetDateTimeFromDateOnlyMethod ( ) =>
519+ StaticType . DateOnly . GetMethod ( "ToDateTime" , new Type [ ] { StaticType . TimeOnly } ) ;
513520#endif
521+
514522 /// <summary>
515523 ///
516524 /// </summary>
@@ -548,6 +556,24 @@ internal static Expression ConvertExpressionToNullableGetValueOrDefaultExpressio
548556 return expression ;
549557 }
550558
559+ #if NET6_0_OR_GREATER
560+ internal static Expression ConvertExpressionToNullableGetValueOrDefaultExpression ( Func < Expression , Expression > converter , Expression expression )
561+ {
562+ if ( Nullable . GetUnderlyingType ( expression . Type ) != null )
563+ {
564+ var converted = converter ( ConvertExpressionToNullableGetValueOrDefaultExpression ( expression ) ) ;
565+ var nullableType = typeof ( Nullable < > ) . MakeGenericType ( converted . Type ) ;
566+ return Expression . Condition (
567+ Expression . Property ( expression , nameof ( Nullable < int > . HasValue ) ) ,
568+ Expression . Convert ( converted , nullableType ) ,
569+ Expression . Constant ( null , nullableType )
570+ ) ;
571+ }
572+
573+ return converter ( expression ) ;
574+ }
575+ #endif
576+
551577 /// <summary>
552578 ///
553579 /// </summary>
@@ -601,7 +627,15 @@ internal static Expression ConvertExpressionToDateTimeToTimeSpanExpression(Expre
601627 /// <param name="expression"></param>
602628 /// <returns></returns>
603629 internal static Expression ConvertExpressionToDateTimeToDateOnlyExpression ( Expression expression ) =>
604- ConvertExpressionToNullableGetValueOrDefaultExpression ( ConvertExpressionToDateOnlyFromDateTimeExpression ( expression ) ) ;
630+ ConvertExpressionToNullableGetValueOrDefaultExpression ( ConvertExpressionToDateTimeFromDateOnlyExpression , expression ) ;
631+
632+ /// <summary>
633+ ///
634+ /// </summary>
635+ /// <param name="expression"></param>
636+ /// <returns></returns>
637+ internal static Expression ConvertExpressionToDateOnlyToDateTimeExpression ( Expression expression ) =>
638+ ConvertExpressionToNullableGetValueOrDefaultExpression ( ConvertExpressionToDateOnlyFromDateTimeExpression , expression ) ;
605639#endif
606640 /// <summary>
607641 ///
@@ -625,6 +659,14 @@ internal static Expression ConvertExpressionToDateTimeTimeOfDayExpression(Expres
625659 /// <param name="expression"></param>
626660 /// <returns></returns>
627661 internal static Expression ConvertExpressionToDateOnlyFromDateTimeExpression ( Expression expression ) =>
662+ Expression . Call ( expression , GetDateTimeFromDateOnlyMethod ( ) , Expression . Constant ( default ( TimeOnly ) ) ) ;
663+
664+ /// <summary>
665+ ///
666+ /// </summary>
667+ /// <param name="expression"></param>
668+ /// <returns></returns>
669+ internal static Expression ConvertExpressionToDateTimeFromDateOnlyExpression ( Expression expression ) =>
628670 Expression . Call ( null , GetDateOnlyFromDateTimeStaticMethod ( ) , expression ) ;
629671#endif
630672 /// <summary>
@@ -907,6 +949,12 @@ internal static Expression ConvertExpressionWithAutomaticConversion(Expression e
907949 {
908950 expression = ConvertExpressionToDateTimeToDateOnlyExpression ( expression ) ;
909951 }
952+
953+ // DateOnly to DateTime
954+ else if ( fromType = = StaticType . DateOnly && toType == StaticType . DateTime )
955+ {
956+ expression = ConvertExpressionToDateOnlyToDateTimeExpression ( expression ) ;
957+ }
910958#endif
911959 // Others
912960 else
@@ -1084,7 +1132,7 @@ internal static Expression ConvertExpressionToClassHandlerSetExpression(Expressi
10841132 return entityOrEntitiesExpression ;
10851133 }
10861134
1087- #endregion
1135+ #endregion
10881136
10891137 #region Common
10901138
0 commit comments