Сравнение LINQ to Entities DateTime

У меня проблема со сравнением дат в LINQ с выражением сущностей. Я хотел бы проверить, если DateTime == DateTime - whole day.

Я хотел сделать это так:

 return context.Events.Any(x => 
                            x.UserId == id 
                            && x.Date >= date 
                            && x.Date < date.AddDays(1) 
                            && x.Type == EventType.StartWork);

Проблема в том, что приведенный выше запрос некорректен для LINQ из-за метода AddDays().

Я пытался использовать DbFunctions, как показано ниже:

return context.Events.Any(x => 
                            x.UserId == id 
                            && x.Date >= date 
                            && x.Date < DbFunctions.AddDays(date, 1) 
                            && x.Type == EventType.StartWork);

Также этот:

  return context.Events.Any(x => 
                                x.UserId == id 
                                && DbFunctions.TruncateTime(date.Date) == date.Date 
                                && x.Type == EventType.StartWork);

Ни один из этих запросов не дает ожидаемых результатов.


person miechooy    schedule 20.07.2016    source источник


Ответы (3)


Просто создайте 2 даты:

var datePlusOneDay = date.AddDays(1);

return context.Events.Any(x => x.UserId == id 
                         && x.Date >= date 
                         && x.Date < datePlusOneDay 
                         && x.Type == EventType.StartWork);

Также я не уверен, но проблема может заключаться в том, что ваша дата может иметь не только часть даты, но и часть времени.

Поэтому, чтобы быть уверенным, что вы выбираете только часть даты вашей переменной DateTime, вы можете сделать это следующим образом:

date = date.Date;
var datePlusOneDay = date.AddDays(1);
person teo van kot    schedule 20.07.2016

Другой способ, который должен работать в Linq-To-Entities, даже если вы не можете инициализировать дату перед запросом, заключается в использовании System.Data.Entity.DbFunctions.DiffDays:

return context.Events
    .Any(x => x.UserId == id && x.Date > date 
        && System.Data.Entity.DbFunctions.DiffDays(x.Date, date) < 1
        && x.Type == EventType.StartWork);
person Tim Schmelter    schedule 20.07.2016
comment
Кажется, это не работает с SQLite. Похоже, SQLite не реализует эти функции сравнения. Или что-то еще? - person dotNET; 25.04.2017

Вы можете добиться желаемого, используя DbFunctions.TruncateTime, но только с обеими частями уравнения:

 return context.Events.Any(x => 
        x.UserId == id 
        && DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(date)
        && x.Type == EventType.StartWork);
person Adil Mammadov    schedule 20.07.2016