ServiceStack AutoQuery присоединиться использовать

Прочитав документацию, я не уверен, но я пришел к выводу, что при создании QueryDb вы не можете выбрать столбцы для объединения? И у меня сложилось впечатление, вы должны иметь объект DTO для копирования? Вы не можете скопировать в обычный объект или динамический объект?

public class SampleAutoQueryDb : QueryDb<MailResponseDetailOrm, object>, ILeftJoin<MailResponseDetailOrm, MailResponseOrm> { }

Может ли кто-нибудь дать представление о присоединении моей MailResponseOrm к MailResponseDetailOrm. MailResponseDetailOrm имеет 5 полей, а именно Email адрес. И я хотел бы, чтобы MailResponseOrm был присоединен к нему Email также. Я также, для хорошей меры, не хочу изменять ни одно имя столбца. Должен ли я создать собственную реализацию или сервис для этого?

ОБНОВИТЬ

Вот мой код, как указано ниже:

        [Alias("MailReportsDetail")]
        public class MailResponseDetailOrm
        {
            public string Email { get; set; }

            public int ID { get; set; }

            [Alias("RespDate")]
            public DateTime? AddedDateTime { get; set; }

            [Alias("DLReport")]
            public string Action { get; set; }

            public string ActionDetail { get; set; }

            public string IP { get; set; }

            public string UserAgent { get; set; }

            public string EmailReferrer { get; set; }
        }

    [Alias("MailReports")]
    public class MailResponseOrm
    {
        public int ID { get; set; }

        public string Email { get; set; }

        public string Address1 { get; set; }

        public string Address2 { get; set; }

        public string City { get; set; }

        public string Company { get; set; }

        public string Contact { get; set; }

        public string Country { get; set; }

        [Alias("LastMail")]
        public DateTime? ModifiedDateTime { get; set; }

        [Alias("LastReport")]
        public string Action { get; set; }

        public DateTime? OptOut { get; set; }

        public string Part { get; set; }

        public string Phone { get; set; }

        public string PostalCode { get; set; }

        public string Source { get; set; }

        public string State { get; set; }

        public string Title { get; set; }

        #region Obsolete

        [Obsolete]
        public string Class { get; set; }

        [Obsolete]
        public string IP { get; set; }

        #endregion
    }

public class SampleAutoQueryDb : QueryDb<MailResponseDetailOrm> { }

public class MyQueryServices : Service
{
    public IAutoQueryDb AutoQuery { get; set; }

    // Override with custom implementation
    public object Any(SampleAutoQueryDb query)
    {
        var q = AutoQuery.CreateQuery(query, base.Request);
        q.Join<MailResponseDetailOrm, MailResponseOrm>((x, y) => x.Email == y.Email)
            // .Select<MailResponseDetailOrm, MailResponseOrm>((x, y) => new { x.ID, y.Email })
            ;
        return AutoQuery.Execute(query, q);
    }
}

2 ответа

Решение

Для объединений в AutoQuery необходимо использовать условные обозначения Справочника объединений OrmLite, и все результаты служб AutoQuery возвращаются в типизированном DTO, который по умолчанию представляет собой запрашиваемую таблицу, или вы можете использовать QueryDb<From,Into> базовый класс для возврата пользовательского результата столбцов из нескольких соединенных таблиц.

Вам потребуется использовать пользовательскую реализацию AutoQuery или собственную реализацию службы, если вам нужны настройки, выходящие за рамки этого, например:

public class SampleAutoQueryDb : QueryDb<MailResponseDetailOrm> { }

public class MyQueryServices : Service
{
    public IAutoQueryDb AutoQuery { get; set; }

    // Override with custom implementation
    public object Any(SampleAutoQueryDb query)
    {
        var q = AutoQuery.CreateQuery(query, base.Request);
        q.Join<MailResponseDetailOrm,MailResponseOrm>((x, y) => x.Email == y.Email);
        return AutoQuery.Execute(query, q);
    }
}

// Запрос на объединение 2-х объектов по именам полей, не заданным в классе.

var q = Db.From<MailResponseDetailOrm>().Join<MailResponseDetailOrm>(x,y) => x.Email = y.Email);

// Запустить запрос

var results = Db.Select(q);
Другие вопросы по тегам