2011-02-18 39 views
0

我们使用下面的代码来生成SQL代码来查询一个firebird数据库;C#LINQ查询日期时间文字生成

DSRCash.GetAll(x => x.Account.ID == Account.ID 
       && x.Date_Record <= dateTO 
       && x.Date_Record >= dateFROM).ToList(); 

dateTO和dateFROM参数都是不可空的DateTime,这对于它们各自的数据库列是相同的。

SQL where子句生成如下;

where (struct_cas0_.DELETED IS NULL) 
     and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */ 
     and struct_cas0_.DATE_RECORD <= '2011-02-18T13:00:00.00' /* @p1 */ 
     and struct_cas0_.DATE_RECORD >= '2010-02-17T13:00:00.00' /* @p2 */ 

您可以看到DateTime文字已经使用“s”或“标准可排序”格式进行格式化。看来Firebird不支持这种日期格式,如果我们从日期时间字面值中删除“T”,查询将成功执行。

是否可以将DateTime转换为正在执行的字符串?

我还应该提到,我们使用NHibernate作为此项目的ORM。

+0

是Ayende的分析器吗?它试图告诉你,这实际上是一个参数 - @ p1/@ p2 - 所以它真的归结为:@ p1/@ p2是如何声明的? as [n] [var] char?或作为日期时间? – 2011-02-18 07:08:01

回答

1

我想你可以使用表达式访问者,当遇到一个日期需要两个路径。 1.如果它是一个常量 - 将其替换为正确格式的字符串,并将其转换为datetime 2.如果它是MemberExpression什么也不做。

这将你的SQL改为

其中(struct_cas0_.DELETED IS NULL) 和struct_cas0_.ACCOUNT_ID = 372/* @ P o */ 和struct_cas0_.DATE_RECORD < = CAST('2011-02-18 'AS DATETIME)/ * @ p1 */ and struct_cas0_DATE_RECORD> = CAST('2010-02-18'AS DATETIME)/ * @ p2 */