Exemple #1
0
        /// <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(".")
            }));
        }