C# 具有子查询返回的NHibernate Linq';如果子查询未使用EXISTS';引入,则只能在选择列表中指定一个表达式;

C# 具有子查询返回的NHibernate Linq';如果子查询未使用EXISTS';引入,则只能在选择列表中指定一个表达式;,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在尝试使以下查询正常工作: var users = session.Query<PersonUser>() .Select(u => new User() { Id = u.UserId, FirstName = u.UserFirstName, Surname = u.UserSurname, ActiveRoles = u.Roles.Select(rr => new Role() { Id = rr.RoleId, Display

我正在尝试使以下查询正常工作:

var users = session.Query<PersonUser>()
.Select(u => new User()
{
    Id = u.UserId,
    FirstName = u.UserFirstName,
    Surname = u.UserSurname,
    ActiveRoles = u.Roles.Select(rr => new Role() { Id = rr.RoleId, DisplayName = rr.RoleName })
})
.ToList();
注:
PersonUser
PersonRole
是POCO数据库实体,
User
Role
是简单的DTO<代码>个人用户。角色是列表映射的多个角色

我如何才能让NH正确地向
用户
DTO投射,包括它与
角色的多对多关系
DTO?


非常感谢您的帮助

sqlserver似乎不接受该查询,因为子查询返回多个列。您可以使用:

var users = session.Query<PersonUser>()
    .Fetch(u => u.Roles).Eager
    .AsEnumerable()
    .Select(u => new User
    {
        Id = u.UserId,
        FirstName = u.UserFirstName,
        Surname = u.UserSurname,
        ActiveRoles = u.Roles.Select(rr => new Role { Id = rr.RoleId, DisplayName = rr.RoleName }).ToList()
    })
    .ToList();
var users=session.Query()
.Fetch(u=>u.Roles)。急切
.可计算的()
.选择(u=>新用户
{
Id=u.UserId,
FirstName=u.UserFirstName,
姓氏=美国用户姓氏,
ActiveRoles=u.Roles.Select(rr=>newrole{Id=rr.RoleId,DisplayName=rr.RoleName})
})
.ToList();

谢谢。您的工作正常,但我需要避免将所有内容加载到内存中,因此我无法使用
.AsEnumerable()
,否则它将无法工作。我添加了.ToList()只是为了测试。实际上,我需要运行更复杂的查询,但我不知道如何正确填充“ActiveRoles”。“我需要避免将所有内容加载到内存中”有这么多属性?注意:仍然可以设置分页。另一种只获取所需内容的方法是
CreateSqlQuery
IResultTransformer
NHibernate现在不支持此类子查询,我得到了完全相同的错误
var users = session.Query<PersonUser>()
    .Fetch(u => u.Roles).Eager
    .AsEnumerable()
    .Select(u => new User
    {
        Id = u.UserId,
        FirstName = u.UserFirstName,
        Surname = u.UserSurname,
        ActiveRoles = u.Roles.Select(rr => new Role { Id = rr.RoleId, DisplayName = rr.RoleName }).ToList()
    })
    .ToList();