Я определил новое неявное соглашение
autoQuery.ImplicitConventions.Add("%WithinLastDays", "{Field} > NOW() - INTERVAL '{Value} days'");
Проблема в том, что для соединения postgres запрос неверно переведен в
WHERE "TABLE"."FIELD" > NOW() - INTERVAL ':0 days'
и не отправляет параметр в базу данных.В случае встроенных соглашений это работает нормально.
UPDATE
Я пытался определить 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: оператор не существует: дата - текст
это определение dto
[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"
});