C # LINQ Query DateTime сгенерированный литерал - PullRequest
0 голосов
/ 18 февраля 2011

Мы используем следующий код для генерации кода 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» из литерала datetime, запрос будет успешно выполнен.

Можно ли изменить преобразование DateTime в выполняемую строку?

Я должен также упомянуть, что мы используем NHibernate в качестве ORM для этого проекта.

1 Ответ

1 голос
/ 24 февраля 2011

Я полагаю, вы могли бы использовать выражение посетитель, который при встрече с датой принимает два пути. 1. Если это константа - замените ее на строку, отформатированную правильно с преобразованием в datetime 2. Если это MemberExpression, ничего не делайте.

Это изменит ваш sql на

где (struct_cas0_.DELETED IS NULL) и struct_cas0_.ACCOUNT_ID = 372 / * @ p0 * / и struct_cas0_.DATE_RECORD <= CAST ('2011-02-18' AS DATETIME) / * @ p1 * / и struct_cas0_.DATE_RECORD> = CAST ('2010-02-18' AS DATETIME) / * @ p2 * /

...