Fluent NHibernate-批量查询子属性集合,而不是单独查询

本文关键字:查询 单独 集合 属性 NHibernate- Fluent | 更新日期: 2023-09-27 18:20:29

我有一个实体,上面有多个其他实体的集合,我想急切地加载它们,最好是一批加载。以下设置示例:

public Entity1
{
    public virtual int Prop1 {get;set;}
    public virtual string Prop2 {get;set;}
    public virtual IList<Entity2> Prop3 {get;set;}
    public virtual IList<Entity3> Prop4 {get;set;}
}
public Entity2
{
    public virtual int Prop1 {get;set;}
    public virtual string Prop2 {get;set;}
}
public Entity3
{
    public virtual int Prop1 {get;set;}
    public virtual string Prop2 {get;set;}
    public virtual IList<Entity1> Prop3 {get;set;}
}

实体映射:

public class Entity1Map : ClassMap<Entity1>
{
    public ClientMap()
    {
        Table("Clients");
        Id(m => m.Prop1);
        Map(m => m.Prop2);
    }
}
public class Entity1Map : ClassMap<Entity1>
{
    public Entity1Map()
    {
        Table("Entity1Table");
        Id(m => m.Prop1);
        Map(m => m.Prop2);
        HasMany(m => m.Prop3).KeyColumn("Prop1").LazyLoad().NotFound.Ignore();
        HasMany(m => m.Prop4).KeyColumn("Prop1").LazyLoad().NotFound.Ignore();
    }
}
public class Entity2Map : ClassMap<Entity2>
{
    public Entity2Map()
    {
        Table("Entity2Table");
        Id(m => m.Prop1);
        Map(m => m.Prop2);
    }
}
public class Entity3Map : ClassMap<Entity3>
{
    public Entity3Map()
    {
        Table("Entity3Table");
        Id(m => m.Prop1);
        Map(m => m.Prop2);
        HasOne(m => m.Prop3).ForeignKey("Prop1").LazyLoad();
    }
}

并使用查询数据库

var query = session.CreateCriteria<Entity1>()
                .CreateCriteria("Prop3", "prop3", JoinType.InnerJoin)
                .Add(Restrictions.Eq(Projections.Property("Prop2"), "Criteria!"))
                .SetFetchMode("Prop3", FetchMode.Join)
                .SetFetchMode("Prop4", FetchMode.Join);
var clients = query.Future<Entity1>().ToList();
//Do other things here with eager loaded collections

当我查询实体1的数据库时,我会得到实体1的集合的返回-正如我所期望的,然而,使用NHProf,我可以看到为实体2/3中的每一个创建了一个查询,以转到数据库并单独收集它们,这意味着实体1的10行返回将引发3倍于该数量的查询。有没有一种方法可以批量处理急切加载的查询,这样就不用每个查询都进行了

SELECT * FROM <table> WHERE id = XXX
SELECT * FROM <table> WHERE id = YYY
SELECT * FROM <table> WHERE id = ZZZ

NHibernate会产生更像的东西

SELECT * FROM <table> WHERE id IN (XXX,YYY,ZZZ)

因此不需要查询数据库那么多次?

非常感谢任何帮助,如果需要更多细节,请告诉我。

Fluent NHibernate-批量查询子属性集合,而不是单独查询

我们的想法是在一个单独的未来查询中进行每个联接。你的查询一团糟,我的也是:

session.CreateCriteria<Entity1>()
    .CreateCriteria("Prop3", "prop3", JoinType.InnerJoin)
    .Add(Restrictions.Eq(Projections.Property("Prop2"), "Criteria!"))
    .Future<Entity1>();
session.CreateCriteria<Entity1>()
    .Add(Restrictions.Eq(Projections.Property("Prop2"), "Criteria!"))
    .SetFetchMode("Prop2", FetchMode.Join)
    .Future<Entity1>();
var query = session.CreateCriteria<Entity1>()
    .Add(Restrictions.Eq(Projections.Property("Prop2"), "Criteria!"))
    .SetFetchMode("Prop4", FetchMode.Join)
    .Future<Entity1>();
var clients = query.ToList();