2

所以,我正在使用 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 在这里带来了什么。我还没有看到一个“直截了当”的例子来说明它是如何工作的……还是我在寻找一桶不存在的金子?

4

1 回答 1

3

AutoQuery仅与 Request DTO 一起使用,即它不需要任何服务实现,因此您的查询:

[Route("/report/detail")]
public class DetailQuery : QueryDb<Detail>
{
    public string[] Div { get; set; }
    public string[] Reg { get; set; }
}

调用 from/report/detail时将查询DetailRDBMS 表。但是这里的属性要么需要匹配表上的Detail列(例如DivReg)才能进行精确匹配(默认),但是精确匹配通常不使用数组完成,而是使用字符串等标量值完成,例如:

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.

于 2017-03-08T21:35:18.330 回答