【问题标题】:Specifying where clause format in Entity Framework with System.Data.SQLite使用 System.Data.SQLite 在实体框架中指定 where 子句格式
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2011-12-31
    • 2019-10-13
    • 2010-11-08
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多