public Expression Transform (MethodCallExpression methodCallExpression)
{
ArgumentUtility.CheckNotNull ("methodCallExpression", methodCallExpression);
MethodCallTransformerUtility.CheckArgumentCount (methodCallExpression, 1);
MethodCallTransformerUtility.CheckInstanceMethod (methodCallExpression);
switch (methodCallExpression.Method.Name)
{
case "Add":
Trace.Assert (methodCallExpression.Method.Name == "Add");
var constantTimeSpanExpression = methodCallExpression.Arguments[0] as ConstantExpression;
if (constantTimeSpanExpression == null)
{
var message =
string.Format (
"The method 'System.DateTime.Add' can only be transformed to SQL when its argument is a constant value. Expression: '{0}'.",
FormattingExpressionTreeVisitor.Format (methodCallExpression));
throw new NotSupportedException (message);
}
return AddTimeSpan ((TimeSpan) constantTimeSpanExpression.Value, methodCallExpression.Object);
case "AddDays":
return AddWithConversion (
methodCallExpression.Arguments[0], TimeSpan.TicksPerDay / TimeSpan.TicksPerMillisecond, methodCallExpression.Object);
case "AddHours":
return AddWithConversion (
methodCallExpression.Arguments[0], TimeSpan.TicksPerHour / TimeSpan.TicksPerMillisecond, methodCallExpression.Object);
case "AddMilliseconds":
return AddMilliseconds (methodCallExpression.Arguments[0], methodCallExpression.Object);
case "AddMinutes":
return AddWithConversion (
methodCallExpression.Arguments[0], TimeSpan.TicksPerMinute / TimeSpan.TicksPerMillisecond, methodCallExpression.Object);
case "AddMonths":
return AddUnits (methodCallExpression.Arguments[0], "month", methodCallExpression.Object);
case "AddSeconds":
return AddWithConversion (
methodCallExpression.Arguments[0], TimeSpan.TicksPerSecond / TimeSpan.TicksPerMillisecond, methodCallExpression.Object);
case "AddTicks":
return AddTicks (methodCallExpression.Arguments[0], methodCallExpression.Object);
case "AddYears":
return AddUnits (methodCallExpression.Arguments[0], "year", methodCallExpression.Object);
default:
var argumentExceptionMessage = string.Format (
"The method '{0}.{1}' is not a supported method.", methodCallExpression.Method.DeclaringType, methodCallExpression.Method.Name);
throw new ArgumentException (argumentExceptionMessage, "methodCallExpression");
}
}