我有一个针对我通过 System.Data.SQLite 连接的 SQLite 数据库运行的 Entity Framwework 4.0 模型。我在数据库中有一个字段,输入“日期”,格式为yyyy-MM-dd
. (我们知道,SQLite 没有内部 Date 或 DateTime 类型)。
Entity Framework 向导愉快地将 Date 类型转换为 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
转换为.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 */)
说了这么多,有没有办法在这个上下文中指定这个 where 子句的格式?
注意:SQLite 是我坚持使用的,'yyyy-MM-dd' 的记录格式不能更改,因为其他软件依赖它。