Пользовательское соглашение об автоматическом запросе сервисов стека не работает с 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
не -
,