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

时间:2017-10-11 13:58:13

标签: c# queryover

我有一个带有以下构造函数UserDTO的DTo类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的参数为空。

1 个答案:

答案 0 :(得分:1)

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

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