servicestack - 需要 AutoQuery 洞察力

标签 servicestack ormlite-servicestack autoquery-servicestack servicestack-autoquery

所以,我正在使用 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 表上的列(例如 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 添加额外的过滤器。

关于servicestack - 需要 AutoQuery 洞察力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677867/

相关文章:

c# - ServiceStack服务OnUnsubscribe\OnSubscribe\OnConnect用户显示名称错误

c# - servicestack.redis GetAll().where() 和 GetByIds() 之间有速度差异吗

c# - ORMLite 加入多个表和多选

ormlite-servicestack - 服务堆栈ORMLite : Mutliple Column GroupBy With Table Aliases

mysql - ServiceStack OrmLite : . Save/SaveAsync 在主键上生成重复条目

javascript - ServiceStack AutoQuery 手动发送过滤器

c# - 将 ServiceStack 自动查询与未实现 IConvertible 的值类型一起使用

c# - 如何使用 ServiceStack Grpc 获取简单的字符串流?

c# - ServiceStack AutoQuery AutoFilter Like 操作数

iis - 服务堆栈启用全局压缩