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();