我应该将result
投放到User
或Role
或Permission
的方式和类型?
用户具有角色且角色具有权限
var result = session.Query<User>()
.Where(c => c.UserName == userName)
.FetchMany(c => c.Roles)
.ThenFetchMany(o => o.Permissions);
答案 0 :(得分:2)
像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();