Свободное отображение Nhibernate / Join

В моем коде у меня есть три основных объекта: 1. Компания 2. Персонал 3. Должность

Персонал может иметь несколько должностей в разных компаниях.

Я хочу получить весь персонал, связанный с конкретной компанией.

В коде я бы сделал что-то вроде:

public partial class Company
{
    public virtual IEnumerable<Position> Positions { get; protected set; }
    public virtual IEnumerable<Staff> Staffs
    {
        get { return Positions.Select(x => x.Staff); }
    }
}

class CompanyMap : ClassMap<Company>
{
    public CompanyMap()
    {
        Id(x => x.Id)
            .Column("CompanyId")
            .GeneratedBy.Identity();
        Map(x => x.Name)
            .Not.Nullable();

        HasMany(x => x.Positions)
            .KeyColumn("CompanyId")
            .AsBag();
    }
}

Pb: В этом решении я буду загружать все должности, связанные с компанией, а затем весь персонал, связанный с каждой должностью... С точки зрения производительности это не очень хорошо, я думаю...

Я уверен, что есть лучший способ выполнить это соединение непосредственно в классе CompanyMap.

Не могли бы вы помочь мне сделать это?

Спасибо, Себастьян

1 ответ

Решение

Как насчет изменения модели данных? Кажется, что Staff всегда в данном Position сбор по данному Company уровень. Это предполагает следующую модель

public partial class Staff
{
   public virtual IEnumerable<CompanyPosition> Positions { get; protected set; }
}

public class Position
{
  //...
}

public class Company
{
 //...
}

public class CompanyPosition
{
  public virtual Company Company   {get;set;}
  public virtual IEnumerable<Position> {get;set;}
}

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

var data = session.Query<Staff>().Where(s=>s.CompanyPosition.Company == company);
Другие вопросы по тегам