0

我有一个针对我通过 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:ssDateTime(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' 的记录格式不能更改,因为其他软件依赖它。

4

1 回答 1

0

一种替代方法ExecuteStoreQuery是首先传递其他 where 子句(如果有),然后强制运行查询(例如使用ToList()),最后在特殊格式的 Date 字段上应用标准 LINQ 过滤器。

于 2013-09-30T17:05:01.950 回答