所以,我正在使用 ServiceStack 并且喜欢它提供的功能。我们已经到了需要实现可查询数据 API 的地步……在我参与这个项目之前,已经完成了半支持的 OData 实现。我宁愿不尝试清除它以使其发挥作用。
这让我想到了自动查询。我想用我们的 SQL Server 数据库尝试一下。我正在查看 http://docs.servicestack.net/autoquery-rdbms 中的示例- 但我一生都无法让它发挥作用。我在这里缺少什么吗?
我正在使用 ORMLite 来查询 SQL,我编写的集成测试表明它按照我的预期工作。我已在容器中注册了 OrmLiteConnectionFactory,以及通过依赖注入(inject)方式使用它的存储库。
具体到到目前为止的代码,我有一个类型和一条基于 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 带来的内容。我还没有看到一个“直接”的例子来说明它是如何工作的......或者我正在寻找一桶金,但根本不存在?
最佳答案
自动查询有效 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
),才能进行精确匹配(默认),但是精确匹配通常不会用数组完成,而是用标量值(如字符串)完成,例如:
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
添加额外的过滤器。
关于servicestack - 需要 AutoQuery 洞察力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677867/