Fluent nhibernate 具有fetchmode的NHibernate分页条件。(使用fluent NH)

Fluent nhibernate 具有fetchmode的NHibernate分页条件。(使用fluent NH),fluent-nhibernate,nhibernate-mapping,Fluent Nhibernate,Nhibernate Mapping,问题:如何获取一个即时加载的条件,以便在所有子集合都设置为fetchmode=eanger的情况下返回根实体上的分页结果 我试图获得一个10项分页的结果集,其中包含急切加载的子集合。问题在于,查询会围绕整个select执行前10个select。使其仅返回前10个结果,包括所有连接的记录。如果第一个实体有10个子对象,则我的结果集将返回1个实体,其中加载了10个子对象。我需要的实体和儿童收集返回水合(懒了)。如果我关闭延迟加载并运行此查询,我将为结果集中的每个关联获取n+1查询 这是我的基本查询过

问题:如何获取一个即时加载的条件,以便在所有子集合都设置为fetchmode=eanger的情况下返回根实体上的分页结果

我试图获得一个10项分页的结果集,其中包含急切加载的子集合。问题在于,查询会围绕整个select执行前10个select。使其仅返回前10个结果,包括所有连接的记录。如果第一个实体有10个子对象,则我的结果集将返回1个实体,其中加载了10个子对象。我需要的实体和儿童收集返回水合(懒了)。如果我关闭延迟加载并运行此查询,我将为结果集中的每个关联获取n+1查询

这是我的基本查询过程:

criteria = context.Session.CreateCriteria<Associate>();
criteria.SetMaxResults(10); //hardcoded for testing
criteria.SetFirstResult(1); //hardcoded for testing
criteria.SetFetchMode("Roles", NHibernate.FetchMode.Eager);
criteria.SetFetchMode("Messages", NHibernate.FetchMode.Eager);
criteria.SetFetchMode("DirectReports", NHibernate.FetchMode.Eager);
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
return criteria.List<Associate>();


public AssociateMap()
    {
        ReadOnly();
        Id(x => x.AssociateId);
        Map(x => x.FirstName);
        Map(x => x.LastName);
        Map(x => x.ManagerId);
        Map(x => x.Department);
        Map(x => x.Email);
        Map(x => x.JobTitle);

        Map(x => x.LastFirstName).Formula("LTRIM(RTRIM(LastName)) + ', ' + LTRIM(RTRIM(FirstName))");

        HasMany(x => x.Messages).KeyColumn("AssociateId").Inverse().Cascade.All();
        HasMany(x => x.Roles).Element("RoleKey");
        HasMany(x => x.DirectReports).KeyColumn("ManagerId").Cascade.None().ForeignKeyConstraintName("FK_Associate_Manager");
        //HasMany(x => x.DirectReports).Element("ManagerId").CollectionType(typeof(Domain.Associate));


    }
criteria=context.Session.CreateCriteria();
标准:SetMaxResults(10)//用于测试的硬编码
标准:SetFirstResult(1)//用于测试的硬编码
SetFetchMode(“角色”,NHibernate.FetchMode.Eager);
criteria.SetFetchMode(“Messages”,NHibernate.FetchMode.Eager);
SetFetchMode(“DirectReports”,NHibernate.FetchMode.Eager);
标准.SetResultTransformer(新DistincTrotentyResultTransformer());
返回条件。List();
公共协会地图()
{
只读();
Id(x=>x.AssociateId);
Map(x=>x.FirstName);
Map(x=>x.LastName);
Map(x=>x.ManagerId);
地图(x=>x.Department);
Map(x=>x.Email);
地图(x=>x.JobTitle);
Map(x=>x.LastFirstName).Formula(“LTRIM(RTRIM(LastName))+”,“+LTRIM(RTRIM(FirstName))”;
HasMany(x=>x.Messages).KeyColumn(“AssociateId”).Inverse().Cascade.All();
有许多(x=>x.Roles)元素(“RoleKey”);
HasMany(x=>x.DirectReports).KeyColumn(“ManagerId”).Cascade.None().ForeignKeyConstraintName(“FK_Associate_Manager”);
//HasMany(x=>x.DirectReports).Element(“ManagerId”).CollectionType(typeof(Domain.Associate));
}

解决方案最终使用子查询设置最大结果。我使用subquerys.PropertyIn添加了子查询。我将“criteria”克隆为“limiter”,因为我在未显示的代码中添加了criteria表达式。因此,我需要将这些条件克隆到子查询中,以便前10个select将出现在“in”语句中。现在我可以急切地加载子集合,并向根实体添加分页,以便在没有笛卡尔或n+1问题的情况下返回10个实体。我将尝试使用更完整、更有组织的代码进行后续操作

//criteria = context.Session.CreateCriteria<Associate>(); 
//changed criteria to DetachedCriteria.
criteria = DetachedCriteria.For<Associate>();

DetachedCriteria limiter = CriteriaTransformer.Clone(criteria); 
limiter.SetProjection(Projections.Id());
limiter.SetMaxResults(10);
criteria.Add(Subqueries.PropertyIn("AssociateId", limiter));

criteria.SetFetchMode("Roles", NHibernate.FetchMode.Eager); 
criteria.SetFetchMode("Messages", NHibernate.FetchMode.Eager); 
criteria.SetFetchMode("DirectReports", NHibernate.FetchMode.Eager); 
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()); 
return criteria.List<Associate>(); 
//criteria=context.Session.CreateCriteria();
//将条件更改为DetachedCriteria。
criteria=DetachedCriteria.For();
DetachedCriteria limiter=CriteriaTransformer.Clone(标准);
limiter.SetProjection(projects.Id());
限制器。SetMaxResults(10);
添加(subquerys.PropertyIn(“AssociateId”,limiter));
SetFetchMode(“角色”,NHibernate.FetchMode.Eager);
criteria.SetFetchMode(“Messages”,NHibernate.FetchMode.Eager);
SetFetchMode(“DirectReports”,NHibernate.FetchMode.Eager);
标准.SetResultTransformer(新DistincTrotentyResultTransformer());
返回条件。List();

解决方案最终使用子查询设置最大结果。我使用subquerys.PropertyIn添加了子查询。我将“criteria”克隆为“limiter”,因为我在未显示的代码中添加了criteria表达式。因此,我需要将这些条件克隆到子查询中,以便前10个select将出现在“in”语句中。现在我可以急切地加载子集合,并向根实体添加分页,以便在没有笛卡尔或n+1问题的情况下返回10个实体。我将尝试使用更完整、更有组织的代码进行后续操作

//criteria = context.Session.CreateCriteria<Associate>(); 
//changed criteria to DetachedCriteria.
criteria = DetachedCriteria.For<Associate>();

DetachedCriteria limiter = CriteriaTransformer.Clone(criteria); 
limiter.SetProjection(Projections.Id());
limiter.SetMaxResults(10);
criteria.Add(Subqueries.PropertyIn("AssociateId", limiter));

criteria.SetFetchMode("Roles", NHibernate.FetchMode.Eager); 
criteria.SetFetchMode("Messages", NHibernate.FetchMode.Eager); 
criteria.SetFetchMode("DirectReports", NHibernate.FetchMode.Eager); 
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()); 
return criteria.List<Associate>(); 
//criteria=context.Session.CreateCriteria();
//将条件更改为DetachedCriteria。
criteria=DetachedCriteria.For();
DetachedCriteria limiter=CriteriaTransformer.Clone(标准);
limiter.SetProjection(projects.Id());
限制器。SetMaxResults(10);
添加(subquerys.PropertyIn(“AssociateId”,limiter));
SetFetchMode(“角色”,NHibernate.FetchMode.Eager);
criteria.SetFetchMode(“Messages”,NHibernate.FetchMode.Eager);
SetFetchMode(“DirectReports”,NHibernate.FetchMode.Eager);
标准.SetResultTransformer(新DistincTrotentyResultTransformer());
返回条件。List();