Search code examples
nhibernatehqldto

Custom Fill Collection in NHibernate


I'm using NHibernate in my web app and it is mapped with my database. I have a model, somthing like this:

public class Company {
   public virtual string Name { get; set; }
   public virtual IList<Employee> Employeers { get; set; }
}

public class Employee {
   public virtual string Name { get; set; }
   public virtual DateTime Birthday { get; set; }
   /* other properties */
   public virtual Company Company { get; set; }
}

PS: it's not real model but it works for my samples/doubts...

I'm using HQL to get my objects and I'd like to know if is there any way to:

1) Get a Company object and fill the Employeers Colletion with Top 10 Employeers Ordered by Birthday Desc ?

2) Is there any way to, when collection is filled, fill it with only some fields like Name and Birthday? I have a lot of properties that I won't use in my view. I can create a DTO for this but I don't know how to do!

Thanks


Solution

  • Persistent collections and entities represent the current state; they can't have just a part of that (think about it: if they did, how would NH track changes?)

    So, in both cases, the answer is queries and DTOs. You can easily retrieve the data you need with HQL:

    class EmployeeNameAndBirthDay
    {
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }
    
    public IList<EmployeeNameAndBirthDay> GetTopEmployees(Company company)
    {
        return session.CreateQuery(@"
                       select Name as Name,
                              Birthday as Birthday
                       from   Employee
                       where  Company = :company
                       order by Birthday desc
                       ")
                      .SetParameter("company", company)
                      .SetMaxResults(10)
                      .SetResultTransformer(
                          Transformers.AliasToBean<EmployeeNameAndBirthDay>())
                      .List<EmployeeNameAndBirthDay>();
    }