У меня есть приложение WPF, которое использует EF6 и Sqlite.Я пытаюсь выполнить относительно простой запрос, который сравнивает даты.Я прочитал тысячу статей по sqlite и датам, и я все еще застрял.
Я не думаю, что это имеет какое-либо отношение к временной части сравнения (т.е. пытается сравнивать только дату).Я понимаю, что мог бы использовать начальную и конечную дату и время для записи записей, которые попадают между ними.Я думаю, что это связано с фактическим SQL, который генерируется orm.
Я думаю, что проблема заключается в SQL, сгенерированном EF6.В SQlite моя таблица имеет поле DATETIME, которое представляет собой строковое значение в следующем формате: «2019-03-23 00: 00: 00.000».
Когда я запускаю запрос как часть приложения в отладке VSВ режиме, запрос не возвращает результатов, и я вижу из зарегистрированного sql, параметр в предложении where это p__linq__0: '23 / 03/2019 00: 00: 00 '
Когда я запускаю тот же самый запросиспользуя Linqpad (нацеленный на ту же базу данных с той же ссылкой dll), запрос действительно возвращает записи, как я ожидал, и я заметил, что sql, сгенерированный linqpad, использует этот формат для параметра @ p__linq__0 DateTime2 = '2019-03-23 00:00: 00.0000000 '
В приложении я ссылаюсь на System.Data.SQLite (v 1.0.110.0) - я не уверен, что использует linqpad.
Я не знаю, как повлиятьсгенерированный SQL в приложении, но linqpad предполагает, что должна быть возможность сгенерировать некоторый совместимый sql.
В случае, если это помогает или я лаю не на том дереве, вот мой запрос linq.Сравнение с параметром "today", который создает различные параметры sql, как указано выше.
public IEnumerable<Menu> GetTodaysMenus()
{
DateTime today = DateTime.Now.Date;
var menus = _context.Menus
.Select(x => new
{
x,
x.SalesBusinessType,
Date = x.MenuDays.Select(y => y.CalendarDate)
})
.Where(x => x.x.DeletedAt == null &&
x.x.Published == true &&
x.Date.Contains(today))
.AsEnumerable()
.Select(x => x.x);
return menus;
}
Я могу воспроизвести сценарий и могу изменить конфигурацию базы данных, но я не уверен, что делатьделать.Я хочу иметь возможность использовать сравнение дат в своем приложении, как я могу это сделать при использовании linqpad.
ОБНОВЛЕНИЕ:
Этот обновленный запрос получает запись, которую я ожидал.Я до сих пор не уверен, почему и что было «не так» с исходным
public IEnumerable<Menu> GetTodaysMenus()
{
string today = DateTime.Now.Date.ToString("yyyy-MM-dd HH:mm:ss.fff");
var menus = _context.Menus
.Select(x => new
{
x,
x.SalesBusinessType,
x.MenuDays,
Date = x.MenuDays.Select(y => y.CalendarDate.ToString())
})
.Where(x => x.x.DeletedAt == null &&
x.x.Published == true &&
x.Date.Contains(today))
.AsEnumerable()
.Select(x => x.x);
return menus;
}
ОБНОВЛЕНИЕ 2:
Прямое сравнение работает, например, так (например, DateTime == сегодня) или в этом примереКоллекция DateTime Содержит (сегодня), однако диапазоны (то есть datetime> = today) не работают.