在Nhibernate中使用Session.Query()

时间:2015-09-17 10:54:00

标签: c# nhibernate

我应该将result投放到UserRolePermission的方式和类型?

用户具有角色且角色具有权限

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

1 个答案:

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