c# - 带子查询的 NHibernate Linq 返回 'Only one expression can be specified in the select list when the subquery is not introduced with EXISTS'

标签 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, DisplayName = rr.RoleName })
})
.ToList();

当我执行查询时,我得到以下信息:

NHibernate.Exceptions.GenericADOException occurred
  Message=could not execute query
[ select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_ ]
[SQL: select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_]
  Source=NHibernate
  SqlString=select personuser0_.USER_ID as col_0_0_, personuser0_.USER_FIRSTNAME as col_1_0_, personuser0_.USER_SURNAME as col_2_0_, (select personrole2_.ROLE_ID, personrole2_.ROLE_NAME from PERSON_ROLE_USER roles1_, PERSON_ROLE personrole2_ where personuser0_.USER_ID=roles1_.USER_ID and roles1_.ROLE_ID=personrole2_.ROLE_ID) as col_3_0_ from PERSON_USER personuser0_

InnerException: System.Data.SqlClient.SqlException
       Message=Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=16
       LineNumber=1
       Number=116
       Procedure=""
       State=1

注意:PersonUserPersonRole 是 POCO 数据库实体,UserRole 是简单的 DTO。 PersonUser.Roles 是列表映射的 HasManyToMany。

我怎样才能让 NH 正确地转换到 User DTO,包括它的多对多关系发送到 Role 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();

关于c# - 带子查询的 NHibernate Linq 返回 'Only one expression can be specified in the select list when the subquery is not introduced with EXISTS',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445466/

相关文章:

c# - 如何在 WPF 中沿路径绘制平行线

c# - 是否可以针对多个身份验证提供程序来保护 ASP.NET Web API 2 应用程序的安全?

c# - Xamarin Mac FFmpeg 启动路径无法访问

c# - 无法创建类型的常量值

c# - NHibernate 4 升级 - 不能同时获取多个包

c# - 在 PropertyGrid 的集合编辑器中更改类型名称

c# - LINQ 按总和分组未按预期工作

c# - LINQ to Object Join 运算符和相等性

linq - Nhibernate 3.2 查询与 QueryOver

nhibernate - Linq 查询中的内连接获取