从 NHibernate QueryOver SelectList 调用对象构造函数

Calling an object constructor from NHibernate QueryOver SelectList

我有一个 DTo class UserDTO 具有以下构造函数 public UserDTO(User user)。我还创建了一个 NHibernate 查询,它检索一个 IList<TodoDTO>,其中每个 TodoDTO 都有以下 属性 public IList<UserDTO> ResponsibleUsers { get; set; }。 我想知道在我的查询中 UserDTO 上的这个构造函数是否有可能,所以像这样:

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>();

构造函数如下所示:
public UserDTO(User user) {}

问题是,当我 运行 此代码时 UserDTO 构造函数中的参数 user 为空。

在查询语法中调用构造函数(或任何其他代码)将不起作用。此处的实体仅用于解析 table 和 sql 查询的列。调用这些对象的方法的能力具有误导性...

您可以使用投影 select 从一个或多个数据库实体到新对象的数据(在您的情况下:到 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 >();