ServiceStack AutoQuery в пользовательский DTO
Итак, я работаю с ServiceStack и немного разбираюсь с ним. Я использовал AutoQuery и считаю его незаменимым при вызове прямых сообщений "GET". У меня проблема, хотя, и я смотрю на это в течение нескольких часов. Я надеюсь, что это просто то, что я пропускаю.
У меня есть простой класс для моего сообщения AutoQuery:
public class QueryCamera : QueryDb<db_camera>
{
}
У меня есть соединение OrmLite, которое используется для получения записей db_camera из базы данных. это все работает просто отлично. Я не хочу возвращать модель из базы данных, хотя в результате я хотел бы вернуть DTO, который я определил как другой класс. Итак, используя версию QueryDb, мое сообщение с запросом теперь выглядит так:
public class QueryCamera : QueryDb<db_camera, Camera>
{
}
Где класс Camera - это мой DTO. Вызов все еще выполняется, но я не получаю результатов. У меня есть метод расширения Mapper ToDto(), настроенный на класс db_camera для возврата экземпляра Camera.
Может быть, я просто привык к тому, что ServiceStack делает все так просто... но как получить приведенный выше запрос AutoQuery для выполнения сопоставления моего запроса? Является ли получение данных теперь ручной операцией для меня, поскольку я указываю нужное преобразование? Где тогда предлагается значение в этом типе? Теперь я обязан запросить базу данных, а затем вызвать.ToDto() в моих записях модели данных, чтобы вернуть объекты DTO?
РЕДАКТИРОВАТЬ: что-то еще, что я только что заметил... Я все еще получаю количество строк из возвращенного набора данных в AutoQueryViewer, но имена полей относятся к классу модели данных db_camera, а не к камере.
1 ответ
QueryDb<From, Into>
не может использовать пользовательский метод расширения DTO, он используется для выбора заданного набора столбцов из выполненного AutoQuery, который также может использоваться для ссылки на столбцы в соединенных таблицах.
Если вы хотите иметь разные имена в 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`
}