0

У меня есть модель 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» не может быть изменен, поскольку другое программное обеспечение полагается на него.

+0

Переход через 'DateTime.Compare' не меняет используемый формат ... – MPelletier

+0

Возможный дубликат [выполнить пользовательский sql с сущностью framework4] (http://stackoverflow.com/questions/4185248/execute-custom-sql- with-entity-framework4) – MPelletier

+0

'context.MyTables.Count (r => r.ADate == date)' должен работать лучше – abatishchev

ответ

0

Одна из альтернатив ExecuteStoreQuery состоит в том, чтобы передать другим, где предложения сначала (если есть), затем принудительно выполнить запрос (например, с ToList()) и, наконец, применить стандартные фильтры LINQ в поле даты специального формата.