需要 AutoQuery 洞察力

AutoQuery insight needed

所以,我正在使用 ServiceStack 并喜欢它提供的功能。我们已经到了需要实现可查询数据 API 的地步......在我开始这个项目之前,已经完成了半支持的 OData 实现。我宁愿不尝试通过除草使其发挥作用。

这让我想到了 AutoQuery。我想用我们的 SQL 服务器数据库试试。我正在查看 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' 集合中的过滤值。 'just work' 这里我错过了什么?我在 ServiceStack 中做了很多工作,从服务本身访问我的存储库,但我试图在这里深入了解 AutoQuery 给 table 带来了什么。我还没有看到一个 'straight forward' 例子来说明它是如何工作的……或者我正在寻找一罐不存在的金子?

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 Table。但是您的属性需要匹配 Detail table 上的列(例如 DivReg)才能获得完全匹配(默认),但是完全匹配通常不使用数组来完成它们使用像字符串这样的标量值来完成,例如:

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.

添加一个额外的过滤器