LINQ DateTime忽略毫秒的查询

时间:2016-07-14 14:42:44

标签: c# linq datetime milliseconds

x.CreateDate DateTime存储在我们的数据库中,直到毫秒。我的dateTimePicker值startdate和enddate只允许查询到秒。

如何更改我的查询以忽略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);

4 个答案:

答案 0 :(得分:1)

以相同格式获取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);

答案 1 :(得分:1)

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);

通过将两个日期作为日期进行比较,这可以避免将表中的每个日期转换为字符串以及后续的字符串比较。

答案 2 :(得分:0)

我不知道为什么我无法从上面发布的查询中获得任何结果,因为我尝试了几种主题变体。但是我确实通过在startdate和enddate变量中添加毫秒来使它正常工作。

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);

答案 3 :(得分:0)

您可以创建扩展方法。

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);