Почему я не могу запросить поле DATETIME, используя EF6 и SQlite? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть приложение 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) не работают.

...