【问题标题】:CASTING Session.Query() in NhibernateNhibernate 中的 CASTING Session.Query()
【发布时间】:2015-09-17 19:41:39
【问题描述】:

我应该如何将result 转换为UserRolePermission

一个用户有角色,一个角色有权限

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

【问题讨论】:

  • 我将被转换为“用户”类型

标签: c# nhibernate


【解决方案1】:

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

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

对于List&lt;User&gt;,您可以致电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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多