Свободный NHibernate - Опрос дочерних коллекций свойств в пакетном, а не по отдельности - PullRequest
1 голос
/ 17 января 2012

У меня есть сущность с несколькими коллекциями других сущностей, и я бы хотел загрузить их, в идеале, в один пакет.Пример настройки ниже:

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,Я получаю возврат коллекции Entity 1 - но, как я ожидаю, я мог бы, однако, используя NHProf, я мог тогда увидеть один создаваемый запрос для каждой из сущностей 2/3, чтобы перейти к базе данных и собрать их индивидуально, что означает, что10-строчный возврат объекта 1 будет запускаться в 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)

И, следовательно, не нужно запрашиватьбазу данных так много раз?

Любая помощь очень ценится, дайте мне знать, если требуется более подробная информация.

1 Ответ

0 голосов
/ 18 января 2012

Идея состоит в том, чтобы сделать каждое соединение отдельным запросом в будущем. Ваш запрос беспорядок, так и мой:

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();
...