Member 14637786 Ответов: 1

EF core SQL datetime filter игнорирует миллисекунды в выражении, как это сделать?


Каков самый простой способ игнорировать миллисекунды при фильтрации по свойству DateTime (datetime2) в SQL Db?

Что я уже пробовал:

What I have is a DateTime filter like this:

<pre>
var parameter = Expression.Parameter(typeof(DeviceAlert), "x");
                var predicate = Expression.Constant(request.AlertCreatedFilter.Value, typeof(DateTime));
                var filterBinaryExpression = EvaluateEqualityOperator((EqualityOperator)request.EqualityOperator, parameter, predicate);
                var toLambdaExpression = Expression.Lambda<Func<DeviceAlert, bool>>(filterBinaryExpression, parameter);

                query = query.Where(toLambdaExpression);



private BinaryExpression EvaluateEqualityOperator(EqualityOperator equalityOperator, Expression parameter, Expression predicate)
        {
            var property = Expression.Property(parameter, typeof(DeviceAlert).GetProperty(nameof(DeviceAlert.CreatedTimestamp)));
            return equalityOperator switch
            {
                EqualityOperator.Equal => Expression.Equal(property, predicate),
                EqualityOperator.GreaterThan => Expression.GreaterThan(property, predicate),
                EqualityOperator.GreaterThanOrEqual => Expression.GreaterThanOrEqual(property, predicate),
                EqualityOperator.LessThan => Expression.LessThan(property, predicate),
                EqualityOperator.LessThanOrEqual => Expression.LessThanOrEqual(property, predicate),
                _ => throw new ArgumentOutOfRangeException("Equality operator not found."),
            };
        }


Все работает нормально, за исключением того, что мне нужно игнорировать миллисекунды в запросах фильтра DateTime. Так, например,
DateTimeField >= 10.08.2020 11:55:15
должен возвращать все значения для этой даты-времени, независимо от того, что такое миллисекунды.

Можно ли это сделать без преобразования в строку и сравнения с Contains?

0x01AA

Обходной путь: DateTimeField > 10.08.2020 11:55:14.999

1 Ответов

Рейтинг:
1

Garth J Lancaster

Будет ли это

var property = Expression.Property(parameter, typeof(DeviceAlert).GetProperty(nameof(DeviceAlert.CreatedTimestamp)));
property = property.AddTicks( - (property.Ticks % TimeSpan.TicksPerSecond));
return equalityOperator switch
{ ... 


Возможно, вам понадобится (вместо 'var property...' использовать 'DateTime property...')

ссылка : c# - как усечь миллисекунды от .NET DateTime[^]