忽略毫秒的 LINQ DateTime 查询

LINQ DateTime Query that ignores milliseconds

x.CreateDate DateTime 以毫秒为单位存储在我们的数据库中。我的 dateTimePicker 值开始日期和结束日期只允许查询到秒。

如何更改我的查询以忽略 x.CreateDate 的毫秒数?我认为我在下面编写的代码可以工作,但事实并非如此。

if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
        .Where(x => x.ApplicationID == applicationId &&
                    x.CreateDate.AddMilliseconds(-x.CreateDate.Millisecond) == startdate)
        .OrderByDescending(x => x.ID)
        .Take(count);

获得相同格式的 CreateDatestartdate 将帮助您比较同类。这应该可以做到这一点。

if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
        .Where(x => x.ApplicationID == applicationId &&
                    x.CreateDate.ToString(@"MM/DD/YYYY h:mm:ss") == startdate.ToString(@"MM/DD/YYYY h:mm:ss")
        .OrderByDescending(x => x.ID)
        .Take(count);
var query =  from l in _context.Logs
             where l.ApplicationID == applicationId
             && SqlMethods.DateDiffSecond(l.CreateDate,startdate) == 0
             orderby l.ID descending
             select l).Take(count);

这避免了将您 table 中的每个日期转换为字符串以及随后的字符串比较,方法是将两个日期作为日期进行比较。

我不知道为什么在我尝试了他们主题的几种变体时无法从上面发布的查询中获得任何结果。但是,我确实通过向开始日期和结束日期变量添加毫秒使其正常工作,并且它正在工作。

if (stardDateIsValid && endDateIsValid)
   startdate = startdate.AddMilliseconds(000);
   enddate = enddate.AddMilliseconds(999);
   query = _context.Logs.Where(x => x.ApplicationID == applicationId && x.CreateDate >= startdate && x.CreateDate <= enddate).OrderByDescending(x => x.ID).Take(count);

您可以创建扩展方法。

public const long TicksPerMillisecond = 10000;
public const long TicksPerSecond = TicksPerMillisecond * 1000;

public static bool IsEqualIgnoreMilliseconds(this DateTime date, DateTime compareDate)
{
    long tickDiff = date.Ticks - compareDate.Ticks;
    return tickDiff > 0 ? tickDiff < TicksPerSecond : tickDiff < -TicksPerSecond;
}

那么你可以使用这个:

if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
    .Where(x => x.ApplicationID == applicationId &&
                x.CreateDate.IsEqualIgnoreMilliseconds(startdate)
    .OrderByDescending(x => x.ID)
    .Take(count);