需要AutoQuery洞察力

时间:2017-03-08 17:23:10

标签: servicestack ormlite-servicestack autoquery-servicestack servicestack-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服务实例。当我使用查询界面时,我点击了我的服务端点,并且看到了我期望的数据 - 过滤掉了&#39; Div&#39;和&#39; Reg&#39;集合。我错过了什么,只是为了工作&#39;这里?我已经在ServiceStack中从服务本身访问我的存储库做了很多工作,但是我试图深入了解AutoQuery在这里给表带来了什么。我还没有看到一个直接的&#39;例如,这是如何工作的......或者我正在寻找一块不在那里的金罐?

1 个答案:

答案 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表格上的列(例如DivReg)才能获得完全匹配(默认),但完全匹配不是&#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添加额外的过滤器。