@@ -26,6 +26,10 @@ public ExpressionHelper(Expression predicateExpression, SqlGeneratorHelper param
2626 }
2727 #endregion
2828
29+ #region Constants
30+ private readonly string NO_DATETIME_SUPPORT = "SqlFunction does not support DateTime functions or variables. It supports DateTime Entity Types" ;
31+ #endregion
32+
2933 #region Private Properties
3034 private static readonly char [ ] _period = new char [ ] { '.' } ;
3135 private IComparer < ExpressionType > _comparer = new OperatorPrecedenceComparer ( ) ;
@@ -204,10 +208,20 @@ protected override Expression VisitMember(MemberExpression memberExpression)
204208 _predicateString . Push ( memberExpression . ToString ( ) + " = 1" ) ;
205209 }
206210 else if ( member . MemberType == MemberTypes . Property &&
207- propertyType == typeof ( System . DateTime ) &&
211+ ( propertyType == typeof ( System . DateTime ) ||
212+ ( propertyType == typeof ( DateTime ? ) ) ) &&
208213 memberExpression . Expression == null )
209214 {
210215 AddToPredicate ( memberExpression ) ;
216+ return memberExpression ;
217+ }
218+ else if ( member . MemberType == MemberTypes . Property &&
219+ propertyType == typeof ( Int32 ) &&
220+ memberExpression . Expression != null &&
221+ memberExpression . ToString ( ) . StartsWith ( "DateTime.Now." ) )
222+ {
223+ AddToPredicate ( memberExpression ) ;
224+ return memberExpression ;
211225 }
212226 else if ( memberExpression . Expression != null &&
213227 memberExpression . Expression . NodeType == ExpressionType . MemberAccess &&
@@ -471,6 +485,10 @@ private MethodCallExpression ParseSqlFunctions(MethodCallExpression methodCall)
471485 throw new Exception ( string . Format ( "Method not implemented: {0}" , methodName ?? "Undetermined method name." ) ) ;
472486
473487 var fieldTypeExpression = methodCall . Arguments [ 0 ] ;
488+
489+ if ( fieldTypeExpression . NodeType == ExpressionType . Convert )
490+ throw new Exception ( NO_DATETIME_SUPPORT ) ;
491+
474492 var functionArgument = methodCall . Arguments [ 1 ] ;
475493 var memberExpression = ( MemberExpression ) fieldTypeExpression ;
476494
@@ -496,15 +514,15 @@ private MethodCallExpression ParseSqlFunctions(MethodCallExpression methodCall)
496514 if ( methodCall . Arguments . Count < 1 )
497515 throw new Exception ( string . Format ( "Method not implemented: {0}" , methodName ?? "Undetermined method name." ) ) ;
498516
499- var fieldTypeExpression = methodCall . Arguments [ 0 ] ;
500- var memberExpression = ( MemberExpression ) fieldTypeExpression ;
517+ Type operandType = null ;
518+ string operand = string . Empty ;
501519
502- if ( fieldTypeExpression == null || memberExpression . Expression == null )
503- throw new ArgumentException ( string . Format ( "Method {0} expects a field type as parameter." , methodName ) ) ;
520+ GetDateOperands ( methodCall , 0 , ref operandType , ref operand ) ;
504521
505- var entityType = memberExpression . Expression . Type ;
506- var propertyName = GetPropertyName ( fieldTypeExpression . ToString ( ) ) ;
507- var datePartFuntion = EntityMapper . SqlGenerator . GetDatePartFunction ( methodName , entityType , propertyName ) ;
522+ if ( operandType == typeof ( DateTime ) || operandType == typeof ( DateTime ? ) )
523+ throw new Exception ( NO_DATETIME_SUPPORT ) ;
524+
525+ var datePartFuntion = EntityMapper . SqlGenerator . GetDatePartFunction ( methodName , operandType , operand ) ;
508526
509527 _predicateString . Push ( datePartFuntion ) ;
510528 }
@@ -514,6 +532,45 @@ private MethodCallExpression ParseSqlFunctions(MethodCallExpression methodCall)
514532 return methodCall ;
515533 }
516534
535+ private void GetDateOperands ( MethodCallExpression methodCall , int argOrdinalPosition , ref Type operandType , ref string operand )
536+ {
537+ Expression fieldTypeExpression = methodCall . Arguments [ argOrdinalPosition ] ;
538+
539+ if ( fieldTypeExpression . NodeType == ExpressionType . Convert )
540+ {
541+ var operandValue = GetDateTimeValue ( fieldTypeExpression ) ;
542+
543+ operandType = typeof ( DateTime ? ) ;
544+ operand = operandValue . HasValue ? operandValue . Value . ToString ( ) : "" ;
545+
546+ }
547+ else if ( fieldTypeExpression . NodeType == ExpressionType . MemberAccess &&
548+ ( ( MemberExpression ) fieldTypeExpression ) . Expression != null &&
549+ ( ( MemberExpression ) fieldTypeExpression ) . Expression . NodeType == ExpressionType . Parameter )
550+ {
551+ var memberExp = ( MemberExpression ) fieldTypeExpression ;
552+
553+ operandType = memberExp . Expression == null ? null : memberExp . Expression . Type ;
554+ operand = GetPropertyName ( memberExp . ToString ( ) ) ;
555+ }
556+ else
557+ {
558+ var operandValue = GetValue ( ( MemberExpression ) fieldTypeExpression ) ;
559+
560+ operand = operandValue . ToString ( ) ;
561+ operandType = typeof ( DateTime ? ) ;
562+ }
563+ }
564+
565+ private DateTime ? GetDateTimeValue ( Expression dateMethod )
566+ {
567+ if ( dateMethod == null ) return null ;
568+
569+ var lambdaExp = Expression . Lambda ( dateMethod ) . Compile ( ) ;
570+ var parameterValue = ( DateTime ? ) lambdaExp . DynamicInvoke ( ) ;
571+
572+ return parameterValue ;
573+ }
517574 #endregion
518575
519576 }
0 commit comments