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' の記録形式は、他のソフトウェアが依存しているため変更できません。