Пользовательское соглашение об автоматическом запросе сервисов стека не работает с PostgreSQL

Я определил новое неявное соглашение

autoQuery.ImplicitConventions.Add("%WithinLastDays", "{Field} > NOW() - INTERVAL '{Value} days'");

Проблема в том, что для соединения postgres запрос неправильно переведен на

WHERE "TABLE"."FIELD" > NOW() - INTERVAL ':0 days'

и он не отправляет параметр в базу данных. В случае встроенных соглашений это работает отлично.

ОБНОВИТЬ

Я пытался определить EndsWithConvention, но есть та же проблема - параметр не передается в движок pgsql (однако он доступен в SqlExpression)

    autoQuery.EndsWithConventions
.Add("WithinLastDays", new QueryDbFieldAttribute() { Template= "{Field} >=  CURRENT_DATE - {Value}", ValueFormat= "interval '{0} days ago'" });

    autoQuery.EndsWithConventions
.Add("WithinLastDays", new QueryDbFieldAttribute() { Template= "{Field} >=  CURRENT_DATE - interval '{Value}'", ValueFormat= "{0} days ago" });

ОБНОВЛЕНИЕ 2 Приведенное ниже определение приводит к PostgresException: 42601: błąd składni w lub blisko "$1" (извините за ошибку на польском языке)

autoQuery.EndsWithConventions.Add("WithinLastDays", new QueryDbFieldAttribute() { Template= "{Field} >=  CURRENT_DATE - interval {Value}", ValueFormat= "{0} days ago" });

Сгенерированный запрос

  SELECT here columns
        FROM table
        WHERE table."publication_date" >=  CURRENT_DATE - interval $1
        LIMIT 100

ОБНОВЛЕНИЕ 3

autoQuery.EndsWithConventions.Add("WithinLastDays", new QueryDbFieldAttribute() { Template= "{Field} >=  CURRENT_DATE - {Value}", ValueFormat= "interval {0} 'days ago'" });

генерирует

SELECT ...
    FROM ...
    WHERE ...."publication_date" >=  CURRENT_DATE - $1

и выдать PostgresException: 42883: оператор не существует: дата - текст

это определение дто

[Route("/search/tenders")]
    public class FindTenders : QueryDb<TenderSearchResult>
    {
        public int? PublicationDateWithinLastDays { get; set; }
    }

модель:

public class EntitiySearchResult
{
    public DateTime PublicationDate { get; set; }
}

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ@mythz решил проблему с регистрацией и проблему с использованием предложения интервала в моем исходном запросе. Приведенное ниже определение отлично работает, чтобы получить записи в течение X дней в прошлом. Спасибо @mythz

  var autoQuery = new AutoQueryFeature() { MaxLimit = 100 };
            autoQuery.EndsWithConventions.Add("WithinLastDays", new QueryDbFieldAttribute
            {
                Template = "{Field} >= CURRENT_DATE + {Value}::interval",
                ValueFormat = "{0} days ago"
            });

1 ответ

Решение

{Value} заменяется параметром db, если вы хотите изменить значение параметра db, вам нужно использовать ValueFormat, например ValueFormat="{0} days",

Определить ValueFormat отформатировать неявное соглашение, необходимое для регистрации EndsWithConventions, например:

autoQuery.EndsWithConventions.Add("WithinLastDays", new QueryDbFieldAttribute { 
    Template= "{Field} >= CURRENT_DATE + {Value}::interval", 
    ValueFormat= "{0} days ago" 
});

Также обратите внимание, что вы, вероятно, хотите CURRENT_DATE + interval не -,

Другие вопросы по тегам