У меня есть модель Entity Framwework 4.0, работающая с базой данных SQLite, к которой я подключаюсь через System.Data.SQLite. У меня есть одно поле в базе данных, которое напечатано «Дата» и отформатировано как yyyy-MM-dd
. (Как известно, SQLite не имеет внутреннего типа Date или DateTime).Задание формата предложения в Entity Framework с System.Data.SQLite
Мастер Entity Framework удачно перевел этот тип даты в DateTime. При выполнении запросов к этому полю даты я был удивлен, узнав, что никаких результатов не было.
Пусть таблица "MyTable":
Create Table MyTable
(
Id Integer Not Null Primary Key,
ADate Date Not Null
);
С System.Data.SQLite и LINQ:
var date = new DateTime(2013, 1, 1);
context.MyTables.AddObject(new MyTable { Id = 0, ADate = date });
context.SaveChanges();
context.MyTables.Where(r => r.ADate == date).Count; // -> returns 0
Заглядывая с ToTraceQuery
, я узнал, что запрос стал:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[ADate] AS [ADate]
FROM [TestDate] AS [Extent1]
WHERE [Extent1].[ADate] = @p__linq__0
С проверкой я обнаружил, что отображаемая переменная p__linq__0
w как преобразованный в фиксированный формат yyyy-MM-dd hh:mm:ss
, так что запрос DateTime(2013,1,1)
означает, что запрос искал '2013-01-01 00:00:00'
, когда все, что нужно было найти, было '2013-01-01'
.
Если люди, которые делают «System.Data.SQLite» было приятно об этом, они бы использовали встроенные функции SQLite и сделано сравнение, как:
WHERE datetime([Extent1].[ADate]) = datetime(@p__linq__0)
или даже
WHERE date([Extent1].[ADate]) = date(@p__linq__0)
только для даты. И действительно, в System.Data.SQLite-х SqlGenerator.cs, мы находим это форматирование для всех типов DateTime:
((System.DateTime)e.Value).ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture), false /* IsUnicode */)
Все это сказать, есть способ, чтобы определить формат для этого, где положение в этом контексте?
Примечания: SQLite - это то, что я застрял, и записанный формат «yyyy-MM-dd» не может быть изменен, поскольку другое программное обеспечение полагается на него.
Переход через 'DateTime.Compare' не меняет используемый формат ... – MPelletier
Возможный дубликат [выполнить пользовательский sql с сущностью framework4] (http://stackoverflow.com/questions/4185248/execute-custom-sql- with-entity-framework4) – MPelletier
'context.MyTables.Count (r => r.ADate == date)' должен работать лучше – abatishchev