@@ -520,7 +520,8 @@ let rec (|SqlColumnGet|_|) (ex:Expression) =
520520 | " IndexOf" , [ String search; SqlColumnGet( al2, col2, typ2) as pe] when integerTypes |> Seq.exists( fun t -> t = pe.Type) -> Some( alias, CanonicalOperation( CanonicalOp.IndexOfStart( SqlConstant search, SqlCol( al2, col2)), col), intType typ)
521521 | " IndexOf" , [ SqlColumnGet( al2, col2,_); SqlColumnGet( al3, col3, typ2) as pe] when integerTypes |> Seq.exists( fun t -> Type.(=)( pe.Type, t)) -> Some( alias, CanonicalOperation( CanonicalOp.IndexOfStart( SqlCol( al2, col2), SqlCol( al3, col3)), col), intType typ)
522522 | _ -> None
523- | t when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< Option< System.DateTime>>) || Type.(=)( t, typeof< ValueOption< System.DateTime>>) -> // DateTime functions
523+ | t when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< Option< System.DateTime>>) || Type.(=)( t, typeof< ValueOption< System.DateTime>>) || // DateTime functions
524+ Type.(=)( t, typeof< System.DateTimeOffset>) || Type.(=)( t, typeof< Option< System.DateTimeOffset>>) || Type.(=)( t, typeof< ValueOption< System.DateTimeOffset>>) ->
524525 match meth.Name, par with
525526 | " AddYears" , [ Int x] -> Some( alias, CanonicalOperation( CanonicalOp.AddYears( SqlConstant( box x)), col), typ)
526527 | " AddYears" , [ SqlColumnGet( al2, col2, typ2) as pe] when integerTypes |> Seq.exists( fun t -> Type.(=)( pe.Type, t)) -> Some( alias, CanonicalOperation( CanonicalOp.AddYears( SqlCol( al2, col2)), col), typ)
@@ -544,7 +545,9 @@ let rec (|SqlColumnGet|_|) (ex:Expression) =
544545 match propInfo.Name with
545546 | " Length" -> Some( alias, CanonicalOperation( CanonicalOp.Length, col), intType typ)
546547 | _ -> None
547- | t when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< Option< System.DateTime>>) || Type.(=)( t, typeof< ValueOption< System.DateTime>>) -> // DateTime functions
548+ | t when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< Option< System.DateTime>>) || Type.(=)( t, typeof< ValueOption< System.DateTime>>) ||
549+ Type.(=)( t, typeof< System.DateTimeOffset>) || Type.(=)( t, typeof< Option< System.DateTimeOffset>>) || Type.(=)( t, typeof< ValueOption< System.DateTimeOffset>>)
550+ -> // DateTime functions
548551 match propInfo.Name with
549552 | " Date" -> Some( alias, CanonicalOperation( CanonicalOp.Date, col), typ)
550553 | " Year" -> Some( alias, CanonicalOperation( CanonicalOp.Year, col), intType typ)
@@ -557,12 +560,16 @@ let rec (|SqlColumnGet|_|) (ex:Expression) =
557560 | _ -> None
558561 | _, OptionalFSharpOptionValue( PropertyGet( Some( MethodCall( Some( OptionalFSharpOptionValue( SqlColumnGet( alias, col, typ)) as p1), meth, [ par])), propInfo))
559562 when ( meth.Name = " Subtract" && ( Type.(=)( meth.ReturnType, typeof< System.TimeSpan>) || Type.(=)( meth.ReturnType, typeof< Option< System.TimeSpan>>) || Type.(=)( meth.ReturnType, typeof< ValueOption< System.TimeSpan>>)) &&
560- ( Type.(=)( p1.Type, typeof< System.DateTime>) || Type.(=)( p1.Type, typeof< Option< System.DateTime>>) || Type.(=)( p1.Type, typeof< ValueOption< System.DateTime>>))) ->
563+ ( Type.(=)( p1.Type, typeof< System.DateTime>) || Type.(=)( p1.Type, typeof< Option< System.DateTime>>) || Type.(=)( p1.Type, typeof< ValueOption< System.DateTime>>) ||
564+ Type.(=)( p1.Type, typeof< System.DateTimeOffset>) || Type.(=)( p1.Type, typeof< Option< System.DateTimeOffset>>) || Type.(=)( p1.Type, typeof< ValueOption< System.DateTimeOffset>>)
565+ )) ->
561566 match propInfo.Name, par with
562- | " Days" , ( SqlColumnGet( al2, col2, typ2) as pe) when ( Type.(=)( pe.Type, typeof< System.DateTime>) || Type.(=)( pe.Type, typeof< Option< System.DateTime>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTime>>)) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffDays( SqlCol( al2, col2)), col), typ)
563- | " Seconds" , ( SqlColumnGet( al2, col2, typ2) as pe) when ( Type.(=)( pe.Type, typeof< System.DateTime>) || Type.(=)( pe.Type, typeof< Option< System.DateTime>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTime>>)) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffSecs( SqlCol( al2, col2)), col), typ)
564- | " Days" , Constant( c, t) when Type.(=)( t, typeof< System.DateTime>) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffDays( SqlConstant( box c)), col), typ)
565- | " Seconds" , Constant( c, t) when Type.(=)( t, typeof< System.DateTime>) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffSecs( SqlConstant( box c)), col), typ)
567+ | " Days" , ( SqlColumnGet( al2, col2, typ2) as pe) when ( Type.(=)( pe.Type, typeof< System.DateTime>) || Type.(=)( pe.Type, typeof< Option< System.DateTime>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTime>>))
568+ || ( Type.(=)( pe.Type, typeof< System.DateTimeOffset>) || Type.(=)( pe.Type, typeof< Option< System.DateTimeOffset>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTimeOffset>>)) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffDays( SqlCol( al2, col2)), col), typ)
569+ | " Seconds" , ( SqlColumnGet( al2, col2, typ2) as pe) when ( Type.(=)( pe.Type, typeof< System.DateTime>) || Type.(=)( pe.Type, typeof< Option< System.DateTime>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTime>>))
570+ || ( Type.(=)( pe.Type, typeof< System.DateTimeOffset>) || Type.(=)( pe.Type, typeof< Option< System.DateTimeOffset>>) || Type.(=)( pe.Type, typeof< ValueOption< System.DateTimeOffset>>)) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffSecs( SqlCol( al2, col2)), col), typ)
571+ | " Days" , Constant( c, t) when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< System.DateTimeOffset>) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffDays( SqlConstant( box c)), col), typ)
572+ | " Seconds" , Constant( c, t) when Type.(=)( t, typeof< System.DateTime>) || Type.(=)( t, typeof< System.DateTimeOffset>) -> Some( alias, CanonicalOperation( CanonicalOp.DateDiffSecs( SqlConstant( box c)), col), typ)
566573 | _ -> None
567574
568575 // Numerical functions
@@ -622,7 +629,10 @@ let rec (|SqlColumnGet|_|) (ex:Expression) =
622629 | _ -> failwith ( " Shouldn't hit " + op.ToString())
623630
624631 if Type.(=)( be.Left.Type, typeof< System.DateTime>) || Type.(=)( be.Right.Type, typeof< System.DateTime>) || Type.(=)( be.Left.Type, typeof< Option< System.DateTime>>) || Type.(=)( be.Right.Type, typeof< Option< System.DateTime>>)
625- || Type.(=)( be.Left.Type, typeof< ValueOption< System.DateTime>>) || Type.(=)( be.Right.Type, typeof< ValueOption< System.DateTime>>) then
632+ || Type.(=)( be.Left.Type, typeof< ValueOption< System.DateTime>>) || Type.(=)( be.Right.Type, typeof< ValueOption< System.DateTime>>) ||
633+ Type.(=)( be.Left.Type, typeof< System.DateTimeOffset>) || Type.(=)( be.Right.Type, typeof< System.DateTimeOffset>) || Type.(=)( be.Left.Type, typeof< Option< System.DateTimeOffset>>) || Type.(=)( be.Right.Type, typeof< Option< System.DateTimeOffset>>)
634+ || Type.(=)( be.Left.Type, typeof< ValueOption< System.DateTimeOffset>>) || Type.(=)( be.Right.Type, typeof< ValueOption< System.DateTimeOffset>>)
635+ then
626636 // DateTime math operations are not supported directly as they return .NET TimeSpan which is not the clear translation of SQL.
627637 // You can use functions like .AddHours(), .AddDays(), .Subtract().Days and comparison.
628638 None
@@ -705,7 +715,8 @@ let rec (|SqlColumnGet|_|) (ex:Expression) =
705715 | _ -> None
706716
707717 | ExpressionType.Call, (:? MethodCallExpression as e) when e.Method.Name = " Parse" && e.Arguments.Count = 1 &&
708- ( Type.(=)( e.Type, typeof< System.DateTime>) || Type.(=)( e.Type, typeof< Option< System.DateTime>>) || Type.(=)( e.Type, typeof< ValueOption< System.DateTime>>)) ->
718+ ( Type.(=)( e.Type, typeof< System.DateTime>) || Type.(=)( e.Type, typeof< Option< System.DateTime>>) || Type.(=)( e.Type, typeof< ValueOption< System.DateTime>>)
719+ || Type.(=)( e.Type, typeof< System.DateTimeOffset>) || Type.(=)( e.Type, typeof< Option< System.DateTimeOffset>>) || Type.(=)( e.Type, typeof< ValueOption< System.DateTimeOffset>>)) ->
709720 // Don't do any magic, just: DateTime.Parse('2000-01-01') -> '2000-01-01'
710721 match e.Arguments.[ 0 ] with
711722 | SqlColumnGet( alias, col, typ) when Type.(=)( typ, typeof< String>) || Type.(=)( typ, typeof< Option< String>>) || Type.(=)( typ, typeof< ValueOption< String>>)
0 commit comments