ServiceStack AutoQuery进入自定义DTO

时间:2017-06-27 16:22:30

标签: servicestack autoquery-servicestack servicestack-autoquery

所以,我正在使用ServiceStack,并且熟悉它。我已经使用了AutoQuery,并且在调用直接'GET'消息时发现它是不可或缺的。我有一个问题,我一直在看这个问题几个小时。我希望这只是我忽视的事情。

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

public class QueryCamera : QueryDb<db_camera>
{
}

我有一个OrmLite连接,用于从数据库中检索db_camera entires。这一切都很好。我不想从数据库中返回一个模型,但结果是,我想返回一个DTO,我将其定义为另一个类。因此,使用QueryDb的版本,我的请求消息现在是:

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

Camera类是我的DTO。呼叫仍然执行,但我没有结果。我在db_camera类上设置了映射器扩展方法ToDto()以返回Camera实例。

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

编辑:我刚刚观察到的其他内容......我仍然从AutoQueryViewer中返回的数据集获取行数,但字段名称是数据模型类db_camera而不是Camera。

enter image description here

1 个答案:

答案 0 :(得分:4)

QueryDb<From, Into>无法使用自定义DTO扩展方法,它已用于执行AutoQuery中的select a curated set of columns,也可用于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`
}