C# NHibernate QueryOver,获取结果为多个sql查询和db命中

C# NHibernate QueryOver,获取结果为多个sql查询和db命中,c#,sql,nhibernate,fetch,queryover,C#,Sql,Nhibernate,Fetch,Queryover,我正在尝试选择一个实体并获取相关列表: Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List(); 还有数百个不同的查询,看起来像: 映射如下所示: public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x

我正在尝试选择一个实体并获取相关列表:

    Session.QueryOver<UserRole>()
           .Fetch(x => x.UsersInRole).Eager
           .List();
还有数百个不同的查询,看起来像:

映射如下所示:

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
        .Inverse()
        .LazyLoad()
        .Table("UsersInRoles");
    }
}
public类UserRoleMap:ClassMap
{
公共用户角色映射()
{
Id(x=>x.Id);
Map(x=>x.RoleName);
HasManyToMany(x=>x.UsersInRole)
.Inverse()
.LazyLoad()
.表格(“用户角色”);
}
}

我想说,这种行为是我们应该期待的。让我们来看一个场景,在这个场景中,系统中有2个用户和2个角色

User1 - Role1 // has only Role1
User2 - Role1 // now we see that Role2 has more then User1
User2 - Role2
假设第一个查询只检索User1及其多对多关系角色1。目前,
ISession
中只有User1,因此Role1的用户集不完整(我们目前无法重用加载到ISession中的对象)。但是我们怎么知道我们在哪里呢?为
Role1
加载的所有数据是否在会话中

必须发出新的查询,加载
Role1
的数据。这样,我们可以在最后得到这些查询的数据

我认为最好的解决方案(我几乎在所有情况下都使用它)是
批量大小设置:


使用
.BatchSize(25)
标记所有集合映射,即使对于类映射也要这样做。这将导致超过1个SQL脚本,但在最后,不会超过1+(2-4),具体取决于批处理大小和页面大小。

尝试了您的建议。结果是1+12个查询-比以前好多了,但是有没有办法使其少于12个?(增加批量?)-批量的成本是多少?我想说,如果一切都好的话,它会被默认设置。批量大小是唯一的解决方案吗?是否存在可能导致2个查询的联接?如果我需要自己用简单的SQL编写,我想两个查询就足够了。谢谢。如果有比批量大小更好的解决方案,我不确定。这在默认情况下没有启用的原因可能是,这打破了简单的逻辑:uninitialize对象的代理是一个驱动程序。它在需要时直接获取数据。批量调整会在会话上增加一些工作,以加入这些选择。无论如何,批量大小取决于我们所有的集合和类映射。即使在大型场景中,表演也令人惊叹
public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
        .Inverse()
        .LazyLoad()
        .Table("UsersInRoles");
    }
}
User1 - Role1 // has only Role1
User2 - Role1 // now we see that Role2 has more then User1
User2 - Role2
HasManyToMany(x => x.UsersInRole)
  ...
  .BatchSize(25)