@@ -204,10 +204,20 @@ protected override Expression VisitMember(MemberExpression memberExpression)
204204 _predicateString . Push ( memberExpression . ToString ( ) + " = 1" ) ;
205205 }
206206 else if ( member . MemberType == MemberTypes . Property &&
207- propertyType == typeof ( System . DateTime ) &&
207+ ( propertyType == typeof ( System . DateTime ) ||
208+ ( propertyType == typeof ( DateTime ? ) ) ) &&
208209 memberExpression . Expression == null )
209210 {
210211 AddToPredicate ( memberExpression ) ;
212+ return memberExpression ;
213+ }
214+ else if ( member . MemberType == MemberTypes . Property &&
215+ propertyType == typeof ( Int32 ) &&
216+ memberExpression . Expression != null &&
217+ memberExpression . ToString ( ) . StartsWith ( "DateTime.Now." ) )
218+ {
219+ AddToPredicate ( memberExpression ) ;
220+ return memberExpression ;
211221 }
212222 else if ( memberExpression . Expression != null &&
213223 memberExpression . Expression . NodeType == ExpressionType . MemberAccess &&
@@ -496,15 +506,12 @@ private MethodCallExpression ParseSqlFunctions(MethodCallExpression methodCall)
496506 if ( methodCall . Arguments . Count < 1 )
497507 throw new Exception ( string . Format ( "Method not implemented: {0}" , methodName ?? "Undetermined method name." ) ) ;
498508
499- var fieldTypeExpression = methodCall . Arguments [ 0 ] ;
500- var memberExpression = ( MemberExpression ) fieldTypeExpression ;
509+ Type operandType = null ;
510+ string operand = string . Empty ;
501511
502- if ( fieldTypeExpression == null || memberExpression . Expression == null )
503- throw new ArgumentException ( string . Format ( "Method {0} expects a field type as parameter." , methodName ) ) ;
512+ GetDateOperands ( methodCall , 0 , ref operandType , ref operand ) ;
504513
505- var entityType = memberExpression . Expression . Type ;
506- var propertyName = GetPropertyName ( fieldTypeExpression . ToString ( ) ) ;
507- var datePartFuntion = EntityMapper . SqlGenerator . GetDatePartFunction ( methodName , entityType , propertyName ) ;
514+ var datePartFuntion = EntityMapper . SqlGenerator . GetDatePartFunction ( methodName , operandType , operand ) ;
508515
509516 _predicateString . Push ( datePartFuntion ) ;
510517 }
@@ -536,28 +543,40 @@ private void ResolveDateDiffFunction(MethodCallExpression methodCall)
536543 Type minuendType = null ;
537544 Type subtrahendType = null ;
538545
539- GetDateDiffOperands ( methodCall , 0 , ref minuendType , ref minuend ) ;
540- GetDateDiffOperands ( methodCall , 1 , ref subtrahendType , ref subtrahend ) ;
546+ GetDateOperands ( methodCall , 0 , ref minuendType , ref minuend ) ;
547+ GetDateOperands ( methodCall , 1 , ref subtrahendType , ref subtrahend ) ;
548+
549+ if ( minuendType == typeof ( DateTime ) || minuendType == typeof ( DateTime ? ) )
550+ {
551+ var paramName = _paramNameGenerator . GetNextParameterName ( _parameterName ) ;
552+
553+ QueryParameters . Add ( paramName , minuend ) ;
554+ minuend = paramName ;
555+ }
556+
557+ if ( subtrahendType == typeof ( DateTime ) || subtrahendType == typeof ( DateTime ? ) )
558+ {
559+ var paramName = _paramNameGenerator . GetNextParameterName ( _parameterName ) ;
560+
561+ QueryParameters . Add ( paramName , subtrahend ) ;
562+ subtrahend = paramName ;
563+ }
541564
542565 var dateDiffFunction = EntityMapper . SqlGenerator . GetDateDiffFunction ( minuendType , minuend , subtrahendType , subtrahend ) ;
543566
544567 _predicateString . Push ( dateDiffFunction ) ;
545-
546568 }
547569
548- private void GetDateDiffOperands ( MethodCallExpression methodCall , int argOrdinalPosition , ref Type operandType , ref string operand )
570+ private void GetDateOperands ( MethodCallExpression methodCall , int argOrdinalPosition , ref Type operandType , ref string operand )
549571 {
550572 Expression fieldTypeExpression = methodCall . Arguments [ argOrdinalPosition ] ;
551573
552574 if ( fieldTypeExpression . NodeType == ExpressionType . Convert )
553575 {
554576 var operandValue = GetDateTimeValue ( fieldTypeExpression ) ;
555- var paramName = _paramNameGenerator . GetNextParameterName ( _parameterName ) ;
556577
557578 operandType = typeof ( DateTime ? ) ;
558- operand = paramName ;
559-
560- QueryParameters . Add ( paramName , operandValue ) ;
579+ operand = operandValue . HasValue ? operandValue . Value . ToString ( ) : "" ;
561580
562581 }
563582 else if ( fieldTypeExpression . NodeType == ExpressionType . MemberAccess &&
@@ -566,16 +585,14 @@ private void GetDateDiffOperands(MethodCallExpression methodCall, int argOrdinal
566585 {
567586 var memberExp = ( MemberExpression ) fieldTypeExpression ;
568587
569- operandType = memberExp . Type ;
588+ operandType = memberExp . Expression == null ? null : memberExp . Expression . Type ;
570589 operand = GetPropertyName ( memberExp . ToString ( ) ) ;
571590 }
572591 else
573592 {
574- var paramName = _paramNameGenerator . GetNextParameterName ( _parameterName ) ;
575- var operandValue = GetValue ( ( MemberExpression ) fieldTypeExpression ) . ToString ( ) ;
593+ var operandValue = GetValue ( ( MemberExpression ) fieldTypeExpression ) ;
576594
577- QueryParameters . Add ( paramName , operandValue ) ;
578- operand = paramName ;
595+ operand = operandValue . ToString ( ) ;
579596 operandType = typeof ( DateTime ? ) ;
580597 }
581598 }
0 commit comments