所以,我正在使用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。答案 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`
}