生成C#LINQ Query DateTime文字

时间:2011-02-18 06:47:29

标签: c# .net linq nhibernate firebird

我们使用以下代码生成SQL代码以针对firebird数据库进行查询;

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似乎不支持这种日期格式,如果我们从datetime文字中删除“T”,查询将成功执行。

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

我还应该提到我们正在使用NHibernate作为这个项目的ORM。

1 个答案:

答案 0 :(得分:1)

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

这会将你的sql改为

其中(struct_cas0_.DELETED为空)        和struct_cas0_.ACCOUNT_ID = 372 / * @ p0 * /        和struct_cas0_.DATE_RECORD&lt; = CAST('2011-02-18'AS DATETIME)/ * @ p1 * /        和struct_cas0_.DATE_RECORD&gt; = CAST('2010-02-18'AS DATETIME)/ * @ p2 * /