Проекция Nhibernate с дочерней коллекцией

#nhibernate #nhibernate-criteria #nhibernate-projections

#nhibernate #nhibernate-критерии #nhibernate-проекции

Вопрос:

Используя NHibernate 2.1, я пытаюсь спроецировать объект и его дочернюю коллекцию в DTO. Моя сущность выглядит следующим образом..

 public class Application
{
  public int Id {get;set;}
  public string Name {get;set;}
  public List<ApplicationSetting> Settings {get;set;}
  // A bunch of other properties that I don't want in the DTO
}

public class ApplicationSetting
{
   public int Id {get;set;}
   public string Name {get;set;}
   public string Code {get;set;}
   // A bunch of other properties that I don't want in the DTO
}
  

Мой DTO выглядит следующим образом..

 public ApplicationDto
{
      public int Id {get;set;}
      public string Name {get;set;}
      public List<ApplicationSettingDto> Settings {get;set;}
}

public class ApplicationSettingDto
{
   public int Id {get;set;}
   public string Name {get;set;}
   public string Code {get;set;}
}
  

Мой код для выбора ТОЛЬКО приложения и его проекта выглядит следующим образом (с использованием Nhibernate 2.1 и nhLambdaExtensions)

   var applicationAlias = new Application();

  var criteria = Session
    .Add<Application>(a => a.Id == id);

      int? Id = null;
  string Name = null;

  criteria
    .SetProjection
    (
      Projections.Distinct(
        Projections.ProjectionList()
          .Add(LambdaProjection.Property<Application>(a => a.Id).As(() => Id))
          .Add(LambdaProjection.Property<Application>(a => a.Name).As(() => Name))
        )
    );

  criteria.SetResultTransformer(Transformers.AliasToBean(typeof(ApplicationDto)));

  var contract = criteria.UniqueResult<ApplicationDto>();
  

Мой вопрос в том, как мне спроецировать только НЕКОТОРЫЕ свойства из объекта ApplicationSettings в ApplicationSettingsDto дочернюю коллекцию?

Комментарии:

1. Вы не сможете делать то, что хотите. Проекция — это сглаженное представление данных, а не объект. Таким образом, у вас не может быть от одного до многих представлений в проекции.

Ответ №1:

Я думаю, вам, возможно, потребуется выполнить MutiQuery и самостоятельно объединить родителей и дочерних элементов DTO.