【发布时间】:2013-10-01 01:05:01
【问题描述】:
我有一个针对我通过 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' 的记录格式无法更改,因为其他软件依赖它。
【问题讨论】:
-
通过
DateTime.Compare不会改变使用的格式... -
context.MyTables.Count(r => r.ADate == date)应该会更好 -
和
AData是该列的一个坏名称,它违反了所有准则和约定。 -
@abatishchev 我试过
.Equals和==,他们都做了同样的事情。两者都转换为完全相同的 SQL。ADate只是用于问题的模型名称,我的表也没有真正命名为“MyTable”。
标签: c# .net entity-framework-4 linq-to-entities system.data.sqlite