【问题标题】:C# LINQ Query DateTime literal generated生成的 C# LINQ 查询 DateTime 文字
【发布时间】:2011-02-18 06:47:29
【问题描述】:

我们正在使用以下代码生成 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 似乎不支持这种日期格式,如果我们从日期时间文字中删除“T”,查询将成功执行。

是否可以将日期时间转换为正在执行的字符串?

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

【问题讨论】:

  • 那是 Ayende 的分析器吗?它试图告诉你这实际上是一个参数 - @p1 / @p2 - 所以它真的归结为:@p1 / @p2 是如何声明的?作为 [n][var] 字符?还是日期时间?
  • 为什么要问两次? stackoverflow.com/questions/5037711/…
  • 是的,SQL 输出来自分析器。您是否暗示该问题可能与 NHibernate 创建参数有关?
  • Daniel ...因为经过调查,我假设问题与数据库无关,而是与表达式生成的 SQL 有关。我犯罪了吗?
  • 我同意...我们可以关闭它(删除它)还是将其指向上一个问题。我是个新手!

标签: c# .net linq nhibernate firebird


【解决方案1】:

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

这会将您的 sql 更改为

哪里(struct_cas0_.DELETED 为空) 和 struct_cas0_.ACCOUNT_ID = 372 /* @p0 */ 和 struct_cas0_.DATE_RECORD = CAST('2010-02-18' AS DATETIME) /* @p2 */

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多