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`
}
Другие вопросы по тегам