ServiceStack AutoQuery 到自定义 DTO

ServiceStack AutoQuery into custom DTO

所以,我正在使用 ServiceStack,并且对它有点了解。我使用过 AutoQuery 并发现在直接调用 'GET' 消息时它是必不可少的。不过我遇到了一个问题,我已经研究了几个小时了。我希望这只是我忽略的事情。

我为我的 AutoQuery 消息设置了一个简单的 class:

public class QueryCamera : QueryDb<db_camera>
{
}

我有一个 OrmLite 连接,用于从数据库中检索 db_camera 个完整数据。这一切都很好。我不想 return 来自数据库的模型,但结果是,我想 return 一个 DTO,我已将其定义为另一个 class。所以,使用 QueryDb 的版本,我的请求消息现在是这样的:

public class QueryCamera : QueryDb<db_camera, Camera>
{
}

相机 class 是我的 DTO。调用仍在执行,但我没有得到任何结果。我在 db_camera class 到 return Camera 实例上设置了映射器扩展方法 ToDto()。

也许我只是习惯了 ServiceStack 让事情变得如此简单......但是我如何获得上面的 AutoQuery 请求来为我的请求执行映射?由于我指定了我想要的转换,现在数据检索对我来说是手动操作吗?那么这种类型的价值在哪里呢?现在我有责任查询数据库,然后在我的数据模型记录上调用 .ToDto() 到 return DTO 对象吗?

编辑:我刚刚观察到的其他东西......我仍然从 AutoQueryViewer 中的 returned 数据集中获取行数,但字段名称属于数据模型 class db_camera 而不是相机。

QueryDb<From, Into> 无法使用您的自定义 DTO 扩展方法,它用于 select a curated set of columns from the executed AutoQuery which can also be used to reference columns on joined tables

如果您想在 DTO 上使用与数据模型不同的名称,您可以使用 [Alias] 属性映射回您的数据库列名称,这样您就可以将 DTO 命名为 属性 你喜欢的都可以。另一方面,您可以更改 属性 DTO 属性 序列化为的内容,例如:

[DataContract]
public class Camera
{
    [DataMember(Name = "Id")]        // serialized as `Id`
    public camera_id { get; set; }   // populated with db_camera.camera_id

    [DataMember]
    [Alias("model")]                 // populated with db_camera.model
    public CameraModel { get; set; } // serialized as `CameraModel`
}