2011-02-18 40 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 */