Сравнение строк как дат с использованием EF core 3 - PullRequest
1 голос
/ 21 апреля 2020

Я перемещаю некоторый код из asp. net в asp. net core, и я не могу найти способ сравнить даты в строковом формате "yyyyMMdd", ie Datediff (день, столбец, «значение») == x , база данных - SQLServer, и изменение типа столбца не является вариантом.

Я использую рефлексию, которая усложняет вещи.

код в asp. net:

    public static Expression ExpressionsDiffDate(Expression cte, Expression property)
    {
        MethodInfo DateDiff = typeof(SqlFunctions).GetMethod("DateDiff", new Type[] { typeof(string), typeof(string), typeof(string) });

        if (property.Type == typeof(DateTime) || property.Type == typeof(DateTime?))
        {
            DateDiff = typeof(SqlFunctions).GetMethod("DateDiff", new Type[] { typeof(string), typeof(DateTime), typeof(DateTime) });
            property = Expression.Convert(property, typeof(DateTime?));
            cte = ConvertExpressionToDate(cte);
        }

        return Expression.Call(
                    DateDiff,
                    Expression.Constant("day"),
                    cte,
                    property
            );
    }

В этом примере я использую метод datediff в классе sqlfunctions, который имеет много перегрузок, в зависимости от типа столбца, который я использую. тот, который принимает datetime в качестве параметров, или тот, который принимает строки.

Мне удалось это сделать для столбцов типа DateTime in. net core

    public static Expression ExpressionsDiffDate(Expression cte, Expression property)
    {
        ParameterExpression exFun = Expression.Parameter(typeof(DbFunctions));
        MethodInfo DateDiff = typeof(SqlServerDbFunctionsExtensions).GetMethod("DateDiffDay", new Type[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) });

        return Expression.Call(
                    DateDiff,
                    exFun,
                    cte,
                    property
            );
    }

Но я могу Не могу понять, как это сделать для столбцов с типом string, поскольку у него нет перегрузок, которые принимают строки.

Спасибо

1 Ответ

0 голосов
/ 21 апреля 2020

Следующая методика "двойного приведения"

(DateTime)(object)stringExpr

или

(DateTime?)(object)stringExpr

может использоваться, чтобы обмануть C# компилятор для обработки string выражения типа как DateTime, таким образом, вы можете вызывать DateTime или DateTime? перегрузки методов DateDiff (или использовать DateTime операторы).

EF Core транслятор запросов для SqlServer сгенерирует от CAST до datetime или datetime2 тип, который должен попробовать преобразование SqlServer по умолчанию из строки.

например что-то вроде этого

if (property.Type == typeof(string))
    property = Expression.Convert(Expression.Convert(property, typeof(object)), typeof(DateTime));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...