Свободное отображение 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);