EntitySchemaQuery запрос создает условие с неполной датой

Добрый день. есть вот такой пример запроса.

Изображение удалено.

идея в том чтоб взять записи которые созданы после определенного времени.

в результате он генерирует следующий SQL запрос который не совсем подходит, так как он возвращает запись которая была возвращена в прошлой выборке (я вытаскиваю данные по 10 записей).

Изображение удалено.

пример запроса, который создается

SELECT
       "Contact"."Name" "Name",
       "Contact"."QSoftGSTime" "QSoftGSTime",
       "Contact"."ContactPhoto" "ContactPhoto",
       "Contact"."Phone" "Phone",
       "Contact"."CreatedOn" "CreatedOn",
       COALESCE("SysCityLcz"."Name", "City"."Name") "City.Name"
FROM
       "public"."Contact" "Contact"
       LEFT OUTER JOIN "public"."City" "City" ON ("City"."Id" = "Contact"."CityId")
       LEFT OUTER JOIN "public"."SysCityLcz" "SysCityLcz" ON ("SysCityLcz"."RecordId" = "City"."Id"
       AND "SysCityLcz"."SysCultureId" = '{F0EA9715-8757-474C-AEE9-743D672E48C9}')
WHERE
       "Contact"."CreatedOn" > TO_TIMESTAMP('2023-02-06 21:21:02.149', 'YYYY-MM-DD HH24:MI:SS.FF3')
ORDER BY
       "CreatedOn" ASC NULLS FIRST
LIMIT 10

получается что при выборке данных проверяется только первые три цифры из милисекунд ('2023-02-06 21:21:02.149', 'YYYY-MM-DD HH24:MI:SS.FF3'). в итоге я получаю два раза одну и ту же запись. решение это указывать все 6 цифр милисекунд следующий запрос выполняется корректно и не приводит к дублированию данных

SELECT
       "Contact"."Name" "Name",
       "Contact"."QSoftGSTime" "QSoftGSTime",
       "Contact"."ContactPhoto" "ContactPhoto",
       "Contact"."Phone" "Phone",
       "Contact"."CreatedOn" "CreatedOn",
       COALESCE("SysCityLcz"."Name", "City"."Name") "City.Name"
FROM
       "public"."Contact" "Contact"
       LEFT OUTER JOIN "public"."City" "City" ON ("City"."Id" = "Contact"."CityId")
       LEFT OUTER JOIN "public"."SysCityLcz" "SysCityLcz" ON ("SysCityLcz"."RecordId" = "City"."Id"
       AND "SysCityLcz"."SysCultureId" = '{F0EA9715-8757-474C-AEE9-743D672E48C9}')
WHERE
       "Contact"."CreatedOn" > TO_TIMESTAMP('2023-02-06 21:21:02.149528', 'YYYY-MM-DD HH24:MI:SS.FF6')
ORDER BY
       "CreatedOn" ASC NULLS FIRST
LIMIT 10

я не нашел способа управлять количеством цифр милисекунд в запросе.

можете подсказать как это правильно сделать?

пока что как хак я решил генерировать запрос с помощью EntitySchemaQuery, делать esqResult.GetSelectQuery(_connection), с него получать текст запроса и в нем уже подменять значения с помощью регулярки. но это выглядит костылем, который не хотелось бы оставлять.

 

спасибо!

 

 

 

 

Нравится

4 комментария

добавлю, что когда пробовал делать через new Select(connection), то такой проблемы не было, но тогда надо вручную управлять локализацией и делать джоины, чего не хотелось бы делать.

так же регулярное выражение может не работать для других типов БД. в данный момент используется PostgreSql

Добрый день,

 

К сожалению пока возможности управления этим количеством символов нет. Поэтому нужно подумать над альтернативными решениями обхода проблемы - возможно увеличить лимит с 10 записей на большее количество, чтобминимизировать риск ошибки, можно попробовать еще модифицировать фильтр. Возможно поможет добавление сортировки по Id - это сделает порядок записей всегда одинаковым, или просто использовать встроенную постраничность.

а можете подсказать как работать с встроенным механизмом постраничной обработки? пример или ссылка на статью. спасибо!

Показать все комментарии