Требуется понимание AutoQuery
Итак, я работаю с ServiceStack и люблю то, что он предлагает. Мы подошли к моменту, когда мне нужно было реализовать API данных с запросами... до моего прихода в этот проект была реализована реализация OData с половинной поддержкой. Я бы предпочел не пытаться пройти через это, чтобы это сработало.
Что подводит меня к AutoQuery. Я хотел бы попробовать это с нашей базой данных SQL Server. Я смотрю на примеры на http://docs.servicestack.net/autoquery-rdbms - но я не могу на всю жизнь заставить это работать. Есть что-то, чего я здесь не хватает?
Я использую ORMLite для запроса SQL, и мои написанные интеграционные тесты показывают, что он работает так, как я ожидал. Я зарегистрировал OrmLiteConnectionFactory в контейнере, а также мой репозиторий, который использует его для внедрения зависимостей.
На данный момент у меня есть тип и сообщение, основанное на QueryDb:
public class Detail
{
public string Div { get; set; }
public string Reg { get; set; }
}
[Route("/report/detail")]
public class DetailQuery : QueryDb<Detail>
{
public string[] Div { get; set; }
public string[] Reg { get; set; }
}
Сообщение DetailQuery используется моим сервисом:
public class ReportService : Service
{
public object Get(DetailQuery dq)
{
// not sure what to put here?
}
}
При этом я могу видеть экземпляр службы AutoQuery в интерфейсе администратора. Когда я играю с интерфейсом запросов, я попадаю в конечную точку своего сервиса и вижу ожидаемые данные - фильтрую значения в коллекциях "Div" и "Reg". Чего мне не хватает для того, чтобы "просто работать" здесь? Я сделал много в ServiceStack, получая доступ к своим репозиториям из самой службы, но я пытаюсь получить некоторое представление о том, что AutoQuery вносит в таблицу здесь. Мне еще предстоит увидеть "прямой" пример того, как это работает... или я ищу горшок с золотом, которого просто нет?
1 ответ
AutoQuery работает только с запросом DTO, т. Е. Не нуждается в реализации сервиса, поэтому ваш запрос:
[Route("/report/detail")]
public class DetailQuery : QueryDb<Detail>
{
public string[] Div { get; set; }
public string[] Reg { get; set; }
}
Когда звонят из /report/detail
запросит Detail
Таблица СУРБД. Но ваши свойства здесь должны соответствовать столбцу на Detail
стол (например Div
или же Reg
), чтобы иметь точное совпадение (по умолчанию), однако точные совпадения обычно не делаются с массивами, они делаются со скалярными значениями, такими как строка, например:
public string Div { get; set; }
public string Reg { get; set; }
Если вы запрашиваете коллекцию, вы вместо этого выполняете запрос IN, где значения будут содержать список значений, и в этом случае они обычно являются множественными:
public string[] Divs { get; set; }
public string[] Regs { get; set; }
и может быть вызван с:
/report/detail?Divs=A,B&Regs=C,D
Который будет выполнять запрос, похожий на:
SELECT * FROM Detail WHERE Div IN ('A','B') AND Rev IN ('C','D')
Если это не то поведение, которое вам нужно, оно должно соответствовать неявному соглашению, например:
public string[] DivBetween { get; set; }
Который затем запросит:
SELECT * FROM Detail WHERE Div BETWEEN 'A' AND 'B'
Если вы хотите, вы можете переопределить службу AutoQuery с помощью пользовательской реализации, например:
public class MyQueryServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
//Override with custom implementation
public object Any(DetailQuery query)
{
var q = AutoQuery.CreateQuery(query, base.Request);
return AutoQuery.Execute(request, q);
}
}
Но вам нужно будет сделать это только тогда, когда вы хотите настроить поведение по умолчанию, например, добавить дополнительный фильтр к заполненному SqlExpression
,