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

4

1 に答える 1

0

代替手段の 1 つExecuteStoreQueryは、最初に他の where 句を渡し (存在する場合)、次にクエリを強制的に実行し (たとえば、 を使用ToList())、最後に特別な形式の Date フィールドに標準の LINQ フィルターを後で適用することです。

于 2013-09-30T17:05:01.950 に答える