2012-03-13 3 views
2

У меня есть два класса DTO как эти:Использование целевой DTO с вложенными DTO для Transformers.AliasToBean в NHibernate

public class Mailing 
{ 
    public string MailingType {get;set;} 
    public DateTime? ValidUntil {get;set;} 
    public Address MailAddress {get;set;} 
} 

и

public class Address 
{ 
    public string Street {get;set;} 
    public string StreetNumber {get;set;} 
    public string ZIP {get;set;} 
} 

В соответствии субъекты simliar с идентичными многие-к-одному связь.

Теперь я хочу прочитать список Mailing с одним запросом, предотвращая ручную конструкцию DTO с foreach. Что-то вроде этого:

return this.session.QueryOver<MailingEntity>() 
    .JoinAlias(p => p.Address,() => addressAlias) 
    .Where(...) 
    .SelectList(list => list 
     .Select(p => p.Type).WithAlias(() => mailingDTO.MailingType) 
     .Select(p => p.ValidTo).WithAlias(() => mailingDTO.ValidUntil) 
     .Select(() => addressAlias.Street).WithAlias(() => addressDTO.Street) 
     .Select(() => addressAlias.ZIP).WithAlias(() => addressDTO.ZIP) 
     .Select(() => addressAlias.StreetNumber).WithAlias(() => addressDTO.StreetNumber) 
     .Select(() => addressDTO).WithAlias(() => mailingDTO.MailAddress) 
    .TransformUsing(Transformers.AliasToBean<Mailing>()) 
    .List<Mailing>(); 

который не работает. Есть ли способ получить вложенные DTO, подобные этому, или у меня есть для пользователя несколько roudtrips соответственно вручную создать DTO?

ответ

1

если LINQ вариант

var query = from e in session.Query<MailingEntity>() 
      let a = e.Address 
      select new Mailing 
      { 
       MailingType = e.Type, 
       ValidUntil = e.ValidTo, 
       MailAddress = new Address 
       { 
        Street = a.Street, 
        ZIP = a.ZIP, 
        StreetNumber = a.StreetNumber 
       } 
      }; 

return query.ToList(); 
+0

Спасибо, хорошая идея. Я проверю его и даю обратную связь ... –

+1

@Andreas H. Обратная связь не найдена – kerzek

+0

Я успешно использовал этот подход, однако у меня была проблема при выполнении подвыборки внутри подвыборки, т.е. родительская> дочерняя коллекция> дочерняя коллекция. При запросе третьего уровня я получил исключение: «код должен быть недоступен» –

Смежные вопросы