将目标DTO与NHibernate中Transformers.AliasToBean的嵌套DTO一起使用

将目标DTO与NHibernate中Transformers.AliasToBean的嵌套DTO一起使用,nhibernate,transform,alias,Nhibernate,Transform,Alias,我有两个DTO类,如下所示: public class Mailing { public string MailingType {get;set;} public DateTime? ValidUntil {get;set;} public Address MailAddress {get;set;} } 及 相应的实体具有相同的多对一关系 现在,我想通过一个查询来阅读邮件列表,防止使用foreach手动构建dto。大概是这样的: return this.session.Query

我有两个DTO类,如下所示:

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

相应的实体具有相同的多对一关系

现在,我想通过一个查询来阅读
邮件列表
,防止使用foreach手动构建dto。大概是这样的:

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>(); 
返回此.session.QueryOver()
.JoinAlias(p=>p.Address,()=>addressAlias)
.其中(…)
.SelectList(list=>list
.Select(p=>p.Type).WithAlias(()=>mailingDTO.MailingType)
.Select(p=>p.ValidTo).with别名(()=>mailingDTO.ValidUntil)
。选择(()=>addressAlias.Street)。使用别名(()=>addressDTO.Street)
。选择(()=>addressAlias.ZIP)。使用别名(()=>addressDTO.ZIP)
。选择(()=>addressAlias.StreetNumber)。使用别名(()=>addressDTO.StreetNumber)
。选择(()=>addressDTO)。使用别名(()=>mailingDTO.MailAddress)
.TransformUsing(Transformers.AliasToBean())
.List();
这是行不通的。 有没有办法获得这样的嵌套DTO,或者我必须使用几个Roudtrip分别手动创建DTO?

如果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();
var query=来自会话中的e.query()
设a=e.地址
选择新邮件
{
MailingType=e.Type,
ValidUntil=e.ValidTo,
MailAddress=新地址
{
街道,
ZIP=a.ZIP,
街道编号=a.街道编号
}
};
返回query.ToList();

@Andreas H.Feedback not Found我已经成功地使用了这种方法,但是,我在子选择中进行子选择时遇到了一个问题,即父级>子级集合>子级集合。当查询第三级时,我遇到了一个异常:“应该无法访问代码”
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();