在hibernate中铸造Session.Query()

本文关键字:Query Session hibernate | 更新日期: 2023-09-27 18:13:05

如何将result转换为UserRolePermission ?

用户有角色,角色有权限

var result = session.Query<User>()
                    .Where(c => c.UserName == userName)
                    .FetchMany(c => c.Roles)
                    .ThenFetchMany(o => o.Permissions);

在hibernate中铸造Session.Query()

Fetch(用于简单属性)和FetchMany(用于集合属性)方法将在nhibernate执行的t-sql查询中创建一个join,并在执行后填充该属性。它将避免属性的延迟加载。但是在调用这些方法之后,您仍然有一个IQueryable<User>(在您的例子中),因为您从它开始。

获取结果(或进行强制转换)取决于您如何具体执行查询linq,例如:

对于List<User>,您可以调用ToList():
var result = session.Query<User>()
                    .Where(c => c.UserName == userName)
                    .FetchMany(c => c.Roles)
                    .ThenFetchMany(o => o.Permissions)
                    .ToList();
// and you could loop it:
foreach (var user in result)
{
      // code...
}
对于单个User对象,您可以调用FirstOrDefault():
var result = session.Query<User>()
                    .Where(c => c.UserName == userName)
                    .FetchMany(c => c.Roles)
                    .ThenFetchMany(o => o.Permissions)
                    .FirstOrDefault();
// and you could use this User object, 
// but make sure it is not null 
if (result != null)
{
   // code...
}

您还可以使用Select()将输出更改为DTO对象,匿名对象,特定值等。例如,使用Select()方法返回一个匿名对象(通常在局部范围内使用并执行一个简单的查询)。

var result = session.Query<User>()
                    .Where(c => c.UserName == userName)
                    .FetchMany(c => c.Roles)
                    .ThenFetchMany(o => o.Permissions)
                    .Select(u => new { u.Id, u.UserName })
                    .ToList(); // or FirstOrDefault();