/// <summary> /// Translates the given method call expression. /// </summary> /// <param name="methodCallExpression">The method call expression.</param> /// <param name="logger"> The logger. </param> /// <returns> /// A SQL expression representing the translated MethodCallExpression. /// </returns> public virtual Expression Translate( MethodCallExpression methodCallExpression, IDiagnosticsLogger <DbLoggerCategory.Query> logger) { var method = methodCallExpression.Method; Expression modifier = null; if (Equals(method, _addMilliseconds)) { modifier = Expression.Add( new ExplicitCastExpression( Expression.Divide( methodCallExpression.Arguments[0], Expression.Convert( Expression.Constant(1000), typeof(double))), typeof(string)), Expression.Constant(" seconds"), _concat); } else if (Equals(method, _addTicks)) { modifier = Expression.Add( new ExplicitCastExpression( Expression.Divide( Expression.Convert( methodCallExpression.Arguments[0], typeof(double)), Expression.Constant((double)TimeSpan.TicksPerSecond)), typeof(string)), Expression.Constant(" seconds"), _concat); } else if (_methodInfoToUnitSuffix.TryGetValue(method, out var unitSuffix)) { modifier = Expression.Add( new ExplicitCastExpression( methodCallExpression.Arguments[0], typeof(string)), Expression.Constant(unitSuffix), _concat); } else { return(null); } Debug.Assert(modifier != null); return(new SqlFunctionExpression( "rtrim", typeof(DateTime), new Expression[] { new SqlFunctionExpression( "rtrim", typeof(DateTime), new Expression[] { SqliteExpression.Strftime( typeof(DateTime), "%Y-%m-%d %H:%M:%f", methodCallExpression.Object, new[] { modifier }), Expression.Constant("0") }), Expression.Constant(".") })); }