Search code examples
c#queryover

Calling an object constructor from NHibernate QueryOver SelectList


I have a DTo class UserDTO with the following constructor public UserDTO(User user). I have also created an NHibernate query which retrieves a IList<TodoDTO> where each TodoDTO has the following property public IList<UserDTO> ResponsibleUsers { get; set; }. I am wondering if it would be possible to this constructor on UserDTO in my query, so something like this:

var responsibleUsers = session.QueryOver<UserTodo>()
    .JoinAlias(ut => ut.User, () => userAlias)
    .Where(ut => ut.Todo.Id.IsIn(_todos.Select(t => t.Id).ToArray()))
    .Select(u => new UserDTO(userAlias)).ToList<UserDTO>();

The constructor looks like this:
public UserDTO(User user) {}

The problem is that when I run this code the parameter in the UserDTO constructor the user is null.


Solution

  • Calling a Constructor, (or any other code) in the syntax of a query won't work. the entities here are only used to resolve the table and columns for the sql query. The ability to call methods of these objects is missleading...

    You can use a Projection to select data from one, or multiple db-entities to a new object (in your case: to the UserDTO)

    UserTodo userTodo = null
    UserDTO result = null;
    var responsibleUsers = session.QueryOver<UserTodo>(() => userTodo)
     .JoinAlias(ut => ut.User, () => userAlias)
     .Where(ut => ut.Todo.Id.IsIn(_todos.Select(t => t.Id).ToArray()))
     .SelectList(list => list
      .Select(() => userAlias.FirstName).WithAlias(() => result.FirstName)
      .Select(() => userAlias.UserId).WithAlias(() => result.IdOfUser)
      .Select(() => userTodo.Age).WithAlias(() => result.Age) // if you require any values from UserTodo
    )
    .TransformUsing(Transformers.AliasToBean<UserDTO >())
    .List<UserDTO >();