在hibernate中铸造Session.Query()
本文关键字:Query Session hibernate | 更新日期: 2023-09-27 18:13:05
如何将result
转换为User
或Role
或Permission
?
用户有角色,角色有权限
var result = session.Query<User>()
.Where(c => c.UserName == userName)
.FetchMany(c => c.Roles)
.ThenFetchMany(o => o.Permissions);
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();