所以,我正在使用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服务实例。当我使用查询界面时,我点击了我的服务端点,并且看到了我期望的数据 - 过滤掉了&#39; Div&#39;和&#39; Reg&#39;集合。我错过了什么,只是为了工作&#39;这里?我已经在ServiceStack中从服务本身访问我的存储库做了很多工作,但是我试图深入了解AutoQuery在这里给表带来了什么。我还没有看到一个直接的&#39;例如,这是如何工作的......或者我正在寻找一块不在那里的金罐?
答案 0 :(得分:3)
AutoQuery有效with just the Request DTO,即不需要任何服务实施,所以您的查询:
[Route("/report/detail")]
public class DetailQuery : QueryDb<Detail>
{
public string[] Div { get; set; }
public string[] Reg { get; set; }
}
从/report/detail
调用时,将查询Detail
RDBMS表。但是,您的属性要么需要匹配Detail
表格上的列(例如Div
或Reg
)才能获得完全匹配(默认),但完全匹配不是&#39;通常使用数组完成它们的标量值,如字符串,例如:
public string Div { get; set; }
public string Reg { get; set; }
如果你是querying a collection,那么你要做一个 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')
如果那不是您想要的行为,则需要匹配implicit convention,例如:
public string[] DivBetween { get; set; }
然后将查询:
SELECT * FROM Detail WHERE Div BETWEEN 'A' AND 'B'
如果你愿意,可以override the AutoQuery service with a custom implementation,例如:
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
添加额外的过滤器。